Java maven:从JDK中排除jar
所以,我已经找了好几个小时了,我完全撞上了这堵砖墙 我的问题很简单:我有一个(相当大的)项目,我想用Maven构建它(这样我就可以稍微自动化一下)。到目前为止,除了一个主要问题外,一切正常 我有一个称为“java插件”的依赖项-我不知道确切的来源或作者,但它在我的依赖项的依赖项中-我将它添加到我们自己的Nexus第三方存储库中,并使用原始jar的名称 从我的Nexus添加此插件没有任何问题,但它具有以下结构:Java maven:从JDK中排除jar,java,eclipse,maven,jar,Java,Eclipse,Maven,Jar,所以,我已经找了好几个小时了,我完全撞上了这堵砖墙 我的问题很简单:我有一个(相当大的)项目,我想用Maven构建它(这样我就可以稍微自动化一下)。到目前为止,除了一个主要问题外,一切正常 我有一个称为“java插件”的依赖项-我不知道确切的来源或作者,但它在我的依赖项的依赖项中-我将它添加到我们自己的Nexus第三方存储库中,并使用原始jar的名称 从我的Nexus添加此插件没有任何问题,但它具有以下结构: - netscape -- javascript JSExce
- 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作为类路径上的“最后一个”JDK。现在是Maven,显然Maven将JDK放在第一位。在我的JDK中,我有jfxrt.jar
(JavaFX的一部分)。这个还包含一个netscape.javascript.JSObject
对象(以及一个netscape.javascript.JSException
对象)。另一方面,它不包含netscape.javascript.JSUtil
对象。因此,Maven从JDK库中选择了JSObject
和JSException
,并从我自己的java插件依赖项中选择了其他类
当然,这两门课是不一样的。当然,现在我得到了编译错误,因为java插件依赖项在JSObject
类中包含了一个“getWindow”方法,而JDK库没有
理想的情况是从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中没有魅力,为什么它不能在IntelliJ中与Maven一起工作
提前谢谢 好吧,我想出来了。显然,这是一个IntelliJ问题,而不是类路径问题 因此IntelliJ自动将完整的JDK(包括/jre/lib中的所有JAR)添加到类路径中-首先,在所有Maven依赖项之前。因此,这导致我的项目变得很奇怪:我在
jfxrt.jar
中、在plugin.jar
中以及在我的Maven插件中都有一个netscape.javascript.JSObject
(这些jar是按此顺序添加的)。找到的第一个JSObject是jfxrt.jar
中的JSObject,这导致了问题
它在Eclipse中工作,我可以改变类路径顺序,并在JDK之前添加了我的Maven插件-因此顺序变成java plugin.jar
(第一个,正确的JSObject类),jfxrt.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>
当我使用一个旧的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>
com.sun.jdk 插件 ${version.java plugin} 罐子 系统 ${java.home}/lib/plugin.jar
- 我在IntelliJ中仍然存在问题,但是我从IntelliJ中导入的JDK库中删除了
,这确实改变了jfxrt.jar
文件,但当然对Jenkins没有任何用处。(您可以通过右键单击项目浏览器中的External Libraries><1.7>文件夹,然后单击打开库设置来编辑这些设置.iml
- 一旦
被删除,一切都正常了。我推断这不会改变Jenkins的任何事情,但另一方面,Jenkins可能根本不存在这个问题。所以我只是尝试将我的代码提交给SVN,在Jenkins上构建它jfxrt.jar
plugin.jar
的依赖,然后在Jenkins上出现了经典的“找不到符号”编译错误,而在IntelliJ中没有出现该错误,因为在类路径上自动导入了JDK
长话短说:通过在IntelliJ中编辑我的项目设置,我让它在本地工作,通过信任Maven,我让它在Jenkins上工作,这是应该的。看看是否可以为您工作(我不知道这些,我只是找到了它们)。不,它们没有帮助,但我认为这是IntelliJ的主要问题,而不是Maven的问题。在这件事上损失了几个小时。。。谢谢