2014-01-23 4 views
14

내 프로젝트 중 하나에서 리소스는 /src/test/resources (일반적인 maven 디렉터리 구조)에 저장되어 있습니다. 이러한 리소스는 프로젝트에 저장된 유틸리티 클래스에 의해 사용됩니다.여러 프로젝트에서 공통 리소스 파일에 액세스하는 방법

유틸리티 클래스 자체가 다른 프로젝트에서 사용되고 있습니다 (다른 프로젝트는이 프로젝트에 의존합니다). 나는 그 같은 리소스에 액세스 할 :

final InputStream inputStreamDobs = 
    ClassLoader.class.getResourceAsStream("/dbunit/clear_db.xml"); 

을하지만 난 다른 프로젝트에서 그것을 사용하기 때문에 경로가 올바르지 않습니다 - 그것은 current project that is being built/tested을 기준으로, 유틸리티 클래스와 자원은 하나없는 곳.

어떻게 접근하나요?

절대 경로가 필요하지 않습니다. 유틸리티 클래스의 상대 경로를 정의하는 방법이 필요합니다.

또한 여러 프로젝트에 걸쳐 리소스를 복제하고 싶지 않습니다. 건배.

편집 : 내가 통합 테스트 (일반 전체 DB 스키마) 후 지워야하는 XML 파일에있는 테이블의 정의가 컨텍스트를 제공합니다. 통합 테스트는 여러 프로젝트에 있지만 명확한 스크립트와 리소스 파일은 모두 동일하며 공통적 인 상위 프로젝트에 있습니다.

EDIT2 :

보너스 질문 : 공통 DTD 파일에 액세스하려는 여러 다른 프로젝트에서 XML 파일에서 액세스해야하는 (의는 tables.dtd를 부르 자). (그것은 공통의 부모 프로젝트에있을 것이다).

현재 나는 여러 프로젝트를 통해 복제 한 나는 지시어 사용하여 XML에서 참조 :

<!DOCTYPE dataset SYSTEM "src/test/resources/dbunit/dobs.dtd"> 

방법이 다른 프로젝트에있는 파일을 가리 키도록을?

답변

6

당신은

를 썼다 ...하지만 난 다른 프로젝트에서 그것을 사용하기 때문에 경로가 올바르지 않습니다 - 그것은 현재 테스트/건설되고 프로젝트가 아닌 하나의 유틸리티 클래스 및 자원을 기준으로 ...

상대 경로는 여기에서 문제가되지 않습니다. 예제에서는 절대 경로를 사용하지만 상대 경로를 사용하더라도 패키지 또는 디렉토리 구조를 참조합니다. getResourceAsStream은 classpath가 올바른 한 그들을 데려 올 것입니다. 실제 문제는 다른 프로젝트에서 테스트 리소스을 언급한다는 것입니다. 그러나 테스트 리소스와 클래스는 프로젝트 산출물에 포함되지 않으므로 종속성으로 포함 된 모듈에서 액세스 할 수 없습니다. 여러 프로젝트에서 테스트를 위해 이러한 리소스가 필요한 경우이 리소스가 src/main/resources에 포함 된 새 프로젝트 ("projectxyz-testresources"라고 가정 해 봅시다)를 작성하고 해당 범위의 "test"범위와의 종속성으로 추가하는 것이 좋습니다.

추가하려면 편집 : 당신이 테스트 리소스에 대한 별도의 프로젝트를 사용하지 않을 경우

, 당신은 목표 jar:test-jar를 사용하여 테스트 클래스 및 자원을 포함하는 테스트 단지를 만들고 테스트로이를 포함 할 수 있습니다 의존. 정규 빌드에서이 목표를 실행하려면 pom에 jar 플러그인을 구성해야 할 수 있습니다.

+0

어째서? 상대 경로를 사용합니다. 프로젝트 루트와 관련이 있습니다. (?) – FazoM

+0

getResourceAsStream은 classpath에서 Resource를로드하려고 시도합니다. 각 클래스 경로 항목의 루트에서 검색하기 때문에 절대적입니다. 상대 경로는 슬래시로 시작하지 않으며 현재 패키지에 상대적으로 검색됩니다. 그래서 여러분의 경로는 절대적으로 파일 시스템에 관한 것이 아니라 자바의 관점에서 절대적입니다. – Drunix

+0

확인. 충분히 공정한 – FazoM

6

런타임 클래스 경로는 src/test/resources를 참조하지 않아야합니다. Maven은 모든 것을 대상으로 복사하여 "/dbunit/clear_db.xml"로 가져올 수 있어야합니다.

+0

맞습니다. 복사 붙여 넣기의 실수입니다. 그래도 질문은 유효합니다. – FazoM

+1

절대 경로는 클래스 경로 루트에 대해 "절대"입니다. 따라서 항아리 나 분해 된 디렉토리에 넣으면 디스크상의 특정 위치가 아닌 클래스 경로를 통해 발견됩니다. 따라서 클래스 경로가 올바른 한 모든 경로에서이 경로를 이식 할 수 있습니다. – evanchooly

+0

하지만 클래스 패스는 프로젝트마다 다릅니다. 맞습니까? (나는 풍부한 Maven 모듈 계층 구조를 가지고있다.) – FazoM

3

이 경우,이 작업을 위해 maven 플러그인을 프로그램하여 제안합니다. 속성을 통해 구성 될 수 있습니다. 또한 Project 개체의 이점을 얻을 수 있습니다.

/** 
* Location of the file. 
*/ 
@Parameter(defaultValue = "${basedir}/src/main/java", property = "sourceFolder", required = true) 
private File sourceFolder; 

@Parameter(defaultValue = "${basedir}/src/test/java", property = "testFolder", required = true) 
private File testFolder; 

@Parameter(defaultValue = "${project}", property = "project", readonly = true, required = true) 
private MavenProject project; 
+0

나는 이것을 (주말 이후에) 아마도 시도 할 것이고 당신에게 업데이트를 줄 것이다. 그러나 나는 그것이 효과가있을 것이라고 생각한다. 감사! – FazoM

+0

@Hannes - 응용 프로그램은 빌드 할 때 사용한 빌드 도구 나 해당 도구에서 예상하는 폴더 구조에 대해 알지 못합니다. 코드베이스의 일부가 아니거나 메이븐 레이아웃을 사용하지 않는 다른 프로젝트의 리소스를 사용하려면 어떻게해야합니까? Java의 클래스 경로는 프로젝트 레이아웃을 알지 않고도이 작업을 수행합니다. – SergeyB

+0

@ike_love Pardon? 나는 너를 따라갈 수 없다. – Hannes

2

Maven 오버레이를 사용해 볼 수 있습니까? 우리는 과거와 비슷한 상황에 직면 해 있었고 오버레이를 사용하여 대단히 해결했습니다. 일반적으로 오버레이는 여러 웹 응용 프로그램에서 공통 리소스를 공유하는 데 사용됩니다. 이러한 접근 방식의

2

어쩌면 하나

하나 : 당신은 XML 파일과 당신이 다음 몇 가지 다른 프로젝트에 포함 할 수있는 별도의 라이브러리로 액세스해야합니다 (유틸리티 클래스와 같은) 자바 클래스를 아웃소싱 (편리하게 maven 의존성으로).

또는 :이 xml 파일을 별도의 VCS 트리 또는 저장소에 저장하고이를 프로젝트 트리에 포함합니다 (예 : SVN의 "외부").따라서 프로젝트에서이 참조를 별도로 업데이트 할 수 있지만 하나의 소스 파일 만 유지하면됩니다.

3

"classpath :"접두사를 사용해 보셨습니까? 클래스 경로에서 리소스를 사용할 수있는 경우 리소스에 대한 전체 경로를 지정하지 않아도됩니다. 예 :

<mvc:resources location="classpath:/META-INF/web-resources/" mapping="/resources/**" /> 

/META-INF/web-resources /는 프로젝트의 종속성 중 하나 인 Spring MVC의 JAR에서 가져온 것입니다. 프로젝트는 클래스 패스를 사용하는 대신에 "직접"리소스에 접근하는 방법을 알 필요가 없습니다.

3

저는이 목적으로 2 개의 플러그인을 사용할 수 있다고 생각합니다. 프로젝트가 웹 프로젝트 인 경우 2 개의 웹 프로젝트를 만들 수 있습니다. 그 중 하나에는 설정 파일이 있고 다른 프로젝트는 기본 프로젝트입니다. 이제 maven-war-plugin으로 프로젝트를 오버레이 할 수 있습니다.

오버레이에는 여러 가지 유형이 있습니다. jar 파일에 대한 자세한 내용은 maven-war-plugin overlay

이 페이지를 방문하여 그들에게 우리는 비슷한 인스턴스했다 maven-assembly-plugin

maven-assembly-plugin

3

하나를 골라을 병합 할 수 있습니다, 우리는 큰 멀티 모듈 메이븐 프로젝트에서 여러 모듈에 걸쳐 사용 된 몇 가지 구성 파일을 가지고있었습니다. 그래서 우리가 한 일은 conf 파일을 별도의 모듈로 나눠서 설정 파일을 처리하는 것입니다. 그리고 나서 그 파일들이 필요한 파일은 config 파일 모듈에 대한 종속성을 선언하고 config 파일과 함께 jar 파일을 사용하고 압축을 풀어 사용할 수 있습니다. 테스트 리소스에 대해 비슷한 작업을 수행 할 수 있습니다. 리소스가있는 모듈을 만든 다음 관련 경로에 배치합니다.

관련 문제