maven:从JDK中排除jar

时间:2014-10-08 11:37:38

标签: java eclipse maven jar

所以,我一直在寻找数小时和数小时,我在这里完全碰到了砖墙。

我的问题非常简单:我有一个(非常大的)项目,我想用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放在" last"一个在我的类路径上。现在它是Maven,显然Maven将JDK放在第一位。在我的JDK中,我有jfxrt.jar(Java FX的一部分)。这个包含一个netscape.javascript.JSObject对象(以及一个netscape.javascript.JSException对象)。另一方面,它不包含netscape.javascript.JSUtil个对象。因此,Maven从JDK库中获取JSObjectJSException,以及从我自己的java-plugin依赖项中获取的其他类。

当然这两个班级都不一样。当然现在我得到编译错误,因为java-plugin依赖包含一个' getWindow' JDK库不在JSObject类中的方法。

理想的情况是从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类(不幸的是它恰好在同一个包中并且具有相同的名称)。我该怎么办呢?当我没有使用Maven时,为什么这个在Eclipse中没有魅力呢?为什么它不能和Intelli一起在IntelliJ中工作呢?

提前致谢!

1 个答案:

答案 0 :(得分:2)

好的,所以我明白了。显然,这更像是一个IntelliJ问题,而不是类路径问题。

因此,IntelliJ会自动将完整的JDK(包括/ jre / lib中的所有jar)添加到类路径中 - 首先,在所有Maven依赖项之前。所以这导致我的项目变得奇怪:我在netscape.javascript.JSObjectjfxrt.jar和我的Maven插件中有plugin.jar(这些罐子按此顺序添加)。找到的第一个JSObject是jfxrt.jar中的那个,导致了这个问题。

它在Eclipse中工作,我可以改变类路径顺序,并在JDK之前添加了我的Maven插件 - 所以顺序变为java-plugin.jar(第一个,正确的JSObject类),jfxrt.jarplugin.jar

当我使用较旧的JDK时,它会起作用 - jfxrt.jar仅在JDK7中添加。

如果我仍然拥有Maven的java-plugin.jar,它可以在Jenkins上运行,因为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文件,但当然不会改变Open Library Settings文件对詹金斯有用。 (您可以通过右键单击项目浏览器中的外部库&gt;&lt; 1.7&gt;文件夹,然后单击jfxrt.jar)来编辑这些设置。

  • 删除plugin.jar后,一切正常。我推断这不会改变詹金斯的任何东西,但另一方面,詹金斯也不会存在这个问题。所以我只是尝试将我的代码提交给SVN,以便在Jenkins上构建它。

奇怪的是,它现在也适用于詹金斯。我尝试并删除了对{{1}}的依赖,然后我得到了经典的&#34;找不到符号&#34; Jenkins上的编译错误 - 虽然我没有在IntelliJ中得到错误,因为在类路径上自动导入了JDK。

长话短说:通过在IntelliJ中编辑我的项目设置,我让它在本地工作,只需信任Maven,我就让它以Jenkins的方式工作。