2014-10-08 99 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上工作。