所以,我一直在寻找数小时和数小时,我在这里完全碰到了砖墙。
我的问题非常简单:我有一个(非常大的)项目,我想用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库中获取JSObject
和JSException
,以及从我自己的java-plugin依赖项中获取的其他类。
当然这两个班级都不一样。当然现在我得到编译错误,因为java-plugin依赖包含一个' getWindow' JDK库不在JSObject
类中的方法。
理想的情况是从Maven中排除jfxrt.jar
,但我完全不知道如何做到这一点。任何其他解决方案也会这样做,只要我能用Maven构建这个解决方案。注意:我不想使用"支持"如果可能的话,Java中的机制,因为这需要一遍又一遍地将这个库上传到几个不同的服务器,并且会导致部署的巨大延迟(因为我们总是必须将文件发送给我们的支持团队进行另一次上传)
谢谢!
修改
所以,我的插件依赖性也是JDK中的东西 - 甚至更好!我不需要我的java插件,我已经用我的JDK自动包含了plugin.jar(它在${java.home}/lib/plugin.jar
中)。
现在我有这种情况:
如您所见,jfxrt.jar首先出现在plugin.jar之前。我可以看到为什么Maven,或者更普遍的Java,一旦找到第一个netscape.javascript.JSObject
(在jfxrt.jar中)就停止查找。但是我真的需要它来加载第二个JSObject类(不幸的是它恰好在同一个包中并且具有相同的名称)。我该怎么办呢?当我没有使用Maven时,为什么这个在Eclipse中没有魅力呢?为什么它不能和Intelli一起在IntelliJ中工作呢?
提前致谢!
答案 0 :(得分:2)
好的,所以我明白了。显然,这更像是一个IntelliJ问题,而不是类路径问题。
因此,IntelliJ会自动将完整的JDK(包括/ jre / lib中的所有jar)添加到类路径中 - 首先,在所有Maven依赖项之前。所以这导致我的项目变得奇怪:我在netscape.javascript.JSObject
,jfxrt.jar
和我的Maven插件中有plugin.jar
(这些罐子按此顺序添加)。找到的第一个JSObject是jfxrt.jar
中的那个,导致了这个问题。
它在Eclipse中工作,我可以改变类路径顺序,并在JDK之前添加了我的Maven插件 - 所以顺序变为java-plugin.jar
(第一个,正确的JSObject类),jfxrt.jar
, plugin.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的方式工作。