2014-10-08 2 views
4

그래서 몇 시간 동안 SO를 검색해 보았습니다. 그리고 저는 여기 벽돌 벽을 완전히 뛰어 넘고 있습니다.maven : jar를 JDK에서 제외하십시오.

내 문제는 아주 간단합니다. Maven을 사용하여 빌드하고 싶다는 (꽤 큰) 프로젝트가 있습니다. 그래서 모든 것을 자동화 할 수 있습니다. 하나의 큰 문제를 제외하고는 모든 것이 지금까지 잘 작동합니다.

"java-plugin"이라는 종속성이 있습니다. 원본 또는 작성자를 정확하게 모르지만 종속성이 종속 관계에 있습니다. - 자체 Nexus 타사에 추가했습니다. 원래의 항아리가 주어진 이름으로 저장소.

이 플러그인은 아무 문제없이 내 넥서스에서 추가됩니다,하지만 다음과 같은 구조가 있습니다

- netscape 
    -- javascript 
     JSException.class 
     JSObject.class 
     JSUtil.class 
    -- security 
     ForbiddenTargetException.class 
     ParameterizedTarget.class 
     Principal.class 
     Privilege.class 
     PrivilegeManager.class 
     PrivilegeTable.class 
     Target.class 
     UserDialogHelper.class 
     UserTarget.class 
- sun 
    -- plugin 
     ... 
    -- plugin2 
     ... 
- com.sun.java.browser.plugin2 
    ... 

문제는 무엇입니까? Eclipse 기반 프로젝트에서 작업하는 한 내 클래스 패스에 "JDK"를 배치했습니다. 이제는 Maven이고 Maven은 JDK를 먼저 배치합니다. 내 JDK에는 jfxrt.jar (Java FX의 일부)이 있습니다. 이 하나의 netscape.javascript.JSObject 개체 (또한 netscape.javascript.JSException 개체)를 포함합니다. 반면에 netscape.javascript.JSUtil 개체를 포함하지 않습니다. 따라서 Maven은 JSObjectJSException을 JDK 라이브러리에서 가져오고 다른 클래스는 내 자신의 java-plugin 의존성에서 가져옵니다.

물론 두 클래스가 동일하지 않습니다. 물론 자바 플러그인 종속성이 JSObject 클래스의 'getWindow'메소드를 포함하므로 컴파일 오류가 발생합니다.

이상적인 상황은 Maven에서 jfxrt.jar을 제외하는 것이지만, 그 방법에 대해서는 전혀 모른다. 다른 솔루션도 Maven으로 빌드 할 수있는 한 그렇게 할 것입니다. 참고 : 가능한 경우 Java에서 "보증"메커니즘을 사용하고 싶지 않습니다.이 라이브러리를 여러 개의 다른 서버에 반복해서 업로드해야하므로 배포가 크게 지연 될 수 있습니다 (우리는 항상 또 다른 업로드를 위해 지원 팀에 파일을 보냈습니다).

감사합니다. 더 나은 -


편집하는 것은

그래서, 내 플러그인 의존성은 JDK도 뭔가입니다! 나는 내 Java 플러그인이 필요 없으며 plugin.jar를 자동으로 포함하는 JDK를 충분히 가지고있다 (내 ${java.home}/lib/plugin.jar에있다).

Dependency problem in Maven

당신이 볼 수 있듯이이의 jfxrt.jar가 plugin.jar하기 전에, 먼저 :

는 지금이 상황이있다. 왜 Maven이 더 일반적으로 Java가 처음으로 netscape.javascript.JSObject (jfxrt.jar에 있음)을 찾자 마자 멈추는 지 알 수 있습니다. 하지만 실제로 두 번째 JSObject 클래스를로드해야합니다.이 클래스는 불행히도 같은 패키지에 있고 같은 이름으로 존재합니다. 도대체 내가 어떻게해야 할까? Eclipse에서 Maven을 사용하지 않고 매력이없는 이유는 무엇입니까? Maven과 함께 IntelliJ에서 작동하지 않는 이유는 무엇입니까?

미리 감사드립니다.

+0

[제안 사항] (http://maven.40175.n5.nabble.com/Removing-JDK-from-compile-classpath-td5713254.html)이 효과가 있는지 확인해보십시오. 방금 찾았습니다.) – watery

+0

아니요, 그들은 도움이되지 못했지만 그것이 Maven 문제가 아니라 IntelliJ의 주요 문제라고 생각했습니다. 이 시간에 몇 시간을 잃어 버렸습니다 ... 고마워요! – testuser

답변

2

좋아, 그래서 알아 냈어. 분명히 이것은 classpath 문제보다 IntelliJ 문제가 훨씬 많았습니다.

그래서 IntelliJ는 전체 Maven 종속성보다 먼저 전체 JDK (/ jre/lib의 모든 jar 포함)를 classpath에 자동으로 추가합니다. 따라서 프로젝트가 이상하게 진행되었습니다. 이 jfxrt.jar, plugin.jar, 내 Maven 플러그인 (이 순서대로 추가되었습니다.)에 netscape.javascript.JSObject이 있습니다. 발견 된 첫 번째 JSObject는 jfxrt.jar에있는 것으로서 문제를 일으켰습니다.

그것은 내가 클래스 경로 순서를 변경할 수 등이 이클립스에서 근무하고 JDK 전에 내 Maven 플러그인을 추가했다 - 그래서 순서는 java-plugin.jar (첫 번째, 올바른의 JSObject 클래스), jfxrt.jar, plugin.jar되었다.

이전 JDK를 사용하면 효과가 있었을 것입니다.이 jfxrt.jar은 JDK7에만 추가되었습니다.

Jenkins가 JDK 라이브러리 (코어 만)를 자동으로 추가하지 않기 때문에 Maven에서 여전히 java-plugin.jar이있는 경우 Jenkins에서 작동합니다. 내가 그것을 삭제하는 방법 즉했다 :

  • 내가 java.plugin.jar 내 자신을 제거하고 plugin.jar에 의존하여 대체했다.

    <dependency> 
        <groupId>com.sun.jdk</groupId> 
        <artifactId>plugin</artifactId> 
        <version>${version.java-plugin}</version> 
        <type>jar</type> 
        <scope>system</scope> 
        <systemPath>${java.home}/lib/plugin.jar</systemPath> 
    </dependency> 
    
  • 나는 아직 IntelliJ에에서 문제가 있었다, 그러나 인 IntelliJ 자체에서 가져온 JDK 라이브러리에서 jfxrt.jar을 제거하기 위해 도착 - .iml 파일 만 젠킨스에 대한 사용이 될 것입니다 물론 아무것도하지를 변경한다. (프로젝트 브라우저에서 외부 라이브러리> < 1.7> 폴더를 마우스 오른쪽 버튼으로 클릭 한 다음 Open Library Settings을 클릭하여이 설정을 편집 할 수 있습니다.

  • jfxrt.jar이 제거되면 모든 것이 작동합니다. 나는 이것이 젠킨스에서 어떤 것도 바뀌지 않을 것이라고 추론했지만 다른 한편으로는 젠킨스에 문제가 없을 수도 있습니다. 그래서 나는 젠킨스에서 SVN을 만들기 위해 단순히 코드를 시도하고 커밋했습니다.

젠킨스는 이제 젠킨스에서도 작동합니다. 내가 시도하고 내 종속성을 plugin.jar 제거한 다음 Jenkins에서 고전적인 "심볼을 찾을 수 없습니다"컴파일 오류가 발생하지만 클래스 경로에서 JDK를 자동으로 가져 오기 때문에 IntelliJ에서 오류가 발생하지는 않습니다.

IntelliJ에서 프로젝트 설정을 편집하면 Maven을 신뢰하여 간단히 Jenkins에서 작동하도록 할 수 있습니다.

관련 문제