2014-10-08 46 views
4

因此,我一直在尋找幾個小時和幾個小時,我在這裏完全跑進了這個磚牆。maven:從JDK中排除罐子

我的問題很簡單:我有一個(很大)的項目,我想用Maven構建(所以我可以自動化所有這一切)。除了一個主要問題,一切都很好。

我有一個名爲「java-plugin」的依賴關係 - 我不確切知道源或作者,但它是依賴於我的依賴關係 - 我將它添加到我們自己的Nexus第三方使用原始jar名稱的存儲庫。

這個插件會從我的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上。在我的JDK中,我有jfxrt.jar(Java FX的一部分)。這一個包含netscape.javascript.JSObject對象(也是一個netscape.javascript.JSException對象)。它不包含另一方面的netscape.javascript.JSUtil對象。所以Maven從JDK庫中獲取JSObjectJSException,以及他從我自己的java插件依賴項中選擇的其他類。

當然這兩個類是不一樣的。當然,現在我得到了編譯錯誤,因爲java-plugin依賴項在JSObject類中包含'getWindow'方法,而JDK庫不包含該方法。

理想的情況是從Maven中排除jfxrt.jar,但我絕對不知道如何做到這一點。任何其他解決方案都可以,只要我能用Maven構建這個解決方案。注意:如果可能的話,我不想在Java中使用「認可」機制,因爲這需要一次又一次地將這個庫上傳到多個不同的服務器,並且會導致部署的巨大延遲(因爲我們一直需要將該文件發送給我們的支持團隊以再次上傳)。

謝謝!


編輯

所以,我的插件依賴的東西,這也是在JDK中 - 甚至更好!我不需要我的java插件,我已經足夠用我的JDK,其中包括plugin.jar自動(它在我的${java.home}/lib/plugin.jar)。

現在我有這樣的情況:

Dependency problem in Maven

正如你所看到的,jfxrt.jar至上,plugin.jar之前。我可以看到,爲什麼Maven或Java更普遍,只要找到第一個netscape.javascript.JSObject(位於jfxrt.jar中)就停止查找。但我真的需要它加載第二個JSObject類(不幸的是,它恰好在同一個包中,並且名稱相同)。我該怎麼做這件事?爲什麼在Eclipse中沒有魅力,當我不使用Maven的時候,爲什麼它在IntelliJ和Maven一起工作?

在此先感謝!

+0

看看[這些建議](http://maven.40175.n5.nabble.com/Removing-JDK-from-compile-classpath-td5713254.html)可以爲你工作(我不知道這些,我剛剛找到他們)。 – watery 2014-10-08 11:54:48

+0

不,他們沒有幫助,但我認爲這是一個主要的IntelliJ問題,而不是Maven問題。在這一個上失去了幾個小時......謝謝! – testuser 2014-10-08 12:40:23

回答

2

好吧,所以我想通了。顯然這是一個IntelliJ問題,而不是類路徑問題。

因此,IntelliJ會自動將完整的JDK(包括/ jre/lib中的所有jar)添加到類路徑中 - 首先,在所有Maven依賴關係之前。所以這導致我的項目變得很奇怪:我在jfxrt.jar的,plugin.jar和我的Maven插件(這些jar被添加的順序)中有一個netscape.javascript.JSObject。發現的第一個JSObject是jfxrt.jar中的一個,它導致了該問題。

它曾在Eclipse作爲在那裏,我可以改變類路徑順序,並加入我的Maven插件的JDK之前 - 這樣的順序成爲java-plugin.jar(第一位的,正確的JSObject類),jfxrt.jarplugin.jar

當我使用較舊的JDK時,它會起作用 - 此jfxrt.jar僅在JDK7中添加。

它在Jenkins上工作,如果我仍然有來自Maven的我的java-plugin.jar,因爲Jenkins不會自動添加JDK庫(僅核心)。這就是我如何清除出來:

  • 我刪除了我自己的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以在Jenkins上構建它。

神奇的是,它現在也在Jenkins上工作。我嘗試並刪除了我對plugin.jar的依賴關係,然後在Jenkins上得到了經典的「找不到符號」編譯錯誤 - 雖然我沒有在IntelliJ中得到這個錯誤,因爲JDK在類路徑中自動導入。

長話短說:通過在IntelliJ中編輯我的項目設置,我通過信任Maven讓它在本地工作,我知道它應該在Jenkins上工作。