2013-07-21 2 views
1

maven 프로젝트가 있습니다. mvn을 새로 설치하면 프로젝트가 빌드되고 내 로컬 저장소 (예 : c : \ repository \ com \ stackoverflow \ A)에서 jar를 사용할 수 있습니다. \에 a.jar절대 경로에서 xml 파일을로드 할 수 없습니다.

에 a.jar 내가 하나 개의 XML 파일을 사용하는 클래스의 방법 중 하나를 호출하고 다른 Maven 프로젝트에서 이러한 클래스

에 의해 사용되는 클래스 및 XML 파일의 부부가 포함되어 있습니다.

코드는 다음과 같습니다

public File xmlFilder(String xmlAbsolutePath) { 
    File f = new File(xmlAbsolutePath); 
    return f; 
} 

두 번째 프로젝트는 내 D 드라이브에 있습니다. 절대 경로를 얻는 과정에서 나는 정확한 절대 경로 인 인 \ com \ stackoverflow \ A \ res \ p.xml을 얻고 있습니다.

public File xmlFilder(String xmlAbsolutePath) { 

    File f = new File(xmlAbsolutePath); 

    System.out.println("AbsolutePath----"+f.getAbsolutePath()); ---> D:\com\stackoverflow\A\res\p.xml 

    System.out.println("getPath------------"+f.getPath());  ---> \com\stackoverflow\A\res\p.xml 

    System.out.println("exists--------------"+f.exists());  ----> false 

return f; 

} 

사람이 내가 잘못 가고 어디 알려 주시기 바랍니다 수 : 나는 3 행에 다음 코드를 추가하는 경우 다음과 같이

는하지만, 내가 얻고있다. C 드라이브에있는 저장소에서 xml을 선택하지 않는 이유는 무엇입니까?

+0

xml 파일의 위치가 명확하지 않습니다. jar 또는 파일 시스템에서로드하려고합니까? –

+0

xml 파일이 A.jar의 resources 폴더에 있습니다. 항아리는 C 드라이브에있는 저장소에 있습니다. 종속성을 올바르게 추가 했으므로 프로젝트 B에서 A.jar에있는 메서드에 올바르게 액세스 할 수 있습니다. – user2604052

답변

1

나는 당신이 잘못된 질문을하고 있다고 생각합니다. 아마도 p.xml에 액세스해야한다는 것을 알고 싶을 것입니다. 가장 좋은 방법은 classpath에 A.jar를 두는 것입니다.이 작업은 "다른 Maven 프로젝트"의 pom.xml에 의존성으로 지정하여 수행합니다. 코드에서 당신이 다음을 수행하십시오

Foo.class.getResource("/thePackagePath/to/p.xml"); 

파일로 XML에 액세스하려고하면 다른 시스템에 휴대용 프로젝트가 아주 나쁜합니다.

+0

getClass()를 사용해 보았습니다.getResource (xmlAbsolutePath); 이제 코드는 다음과 같습니다. File f = null; \t \t { \t \t URL resourceFile = getClass(). getResource (xmlAbsolutePath); \t \t if (resourceFile! = null) { \t \t \t f = new File (resourceFile.toURI()); \t \t \t System.out.println ("FILE EXISTS -----"+ f.exists()); \t \t \t \t }} 캐치 (URISyntaxException 전자) { \t \t \t e.printStackTrace(); \t \t} return f; 그러나 경로를 디버깅 할 때 jar : file : \ C : \ repository \ com \ stackOverflow \ A.jar! \ com \ stackOverflow \ A \ resources \ p.xml과 같이 나타납니다. 누구든지 전화를 할 수있는 이유는 "!" 현재 존재하는 URI 경로 – user2604052

+0

http://download.java.net/jdk7/archive/b123/docs/api/java/net/JarURLConnection.html은 '!'의 이유를 설명합니다. –

2

A 클래스 (즉, A.jar에 번들되어 있음)가 jar에서 xml을로드하려고하고 첫 번째 코드 예제에 표시된 방식으로 액세스하려고 시도하면 은 내에서 p.xml에 액세스하지 않습니다. 병. 해당 위치에있는 파일에 액세스합니다.

귀하의 경우에 쉽게 테스트 할 수 있습니다. jar 파일을 만든 후 파일 시스템에서 p.xml을 임시로 삭제하고 A 클래스를 실행합니다. 로드하지 못합니다.

클래스가 jar에 번들 된 리소스를로드해야하는 경우 File이 아니라 클래스 로더를 사용합니다. 사용자가 제공 한 이름에서

, 당신의 클래스 A 패키지에 있다고 가정합니다 com.stackoverflow.A XML 파일은 XML로 스트림을로드 com.stackoverflow.A.res

모든 방법 아래의 패키지에

InputStream is = null; 

// Using class - relative to the class location because path does not start with "/" 
is = SimpleWriter.class.getResourceAsStream("res/p.xml"); 

// Using class - absolute path because path starts with "/" 
is = SimpleWriter.class.getResourceAsStream("/com/stackoverflow/A/res/p.xml"); 

// Using classloader - path is *always* absolute. Note that leading "/" is missing 
is = SimpleWriter.class.getClassLoader().getResourceAsStream("com/stackoverflow/A/res/p.xml"); 
+0

필자가 제안한대로 getClass(). getResource (xmlAbsolutePath);를 사용해 보았습니다. Now 코드는 다음과 같습니다. File f = null; try {URL resourceFile = getClass(). getResource (xmlAbsolutePath); if (resourceFile! = null) {f = 새 파일 (resourceFile.toURI()); System.out.println ("FILE EXISTS -----"+ f.exists()); }} catch (URISyntaxException e) {e.printStackTrace(); } return f; 하지만 경로를 디버깅 할 때 jar : file : \ C : \ repository \ com \ stackOverflow \ A.jar! \ com \ stackOverflow \ A \ res ources \ p.xml와 같이 표시됩니다. 왜 "!" 존재합니다 내 문제를 일으키는 URI 경로 – user2604052

+0

여기가 우연히 게시됩니다. 'getResource()'사용을 제안하지 않았습니다. jar 파일 안의 경로에 대해 '!'표기법이 일반적입니다. –

+0

getResource() 사용에 문제가 있는지 알려 주실 수 있습니까? 또한 어떻게 제거 할 수 있습니까? 기호 그래서 내가 실제로 코드를 사용할 수 있습니다. 어떤 아이디어라도 환영합니다. – user2604052

관련 문제