当前位置: 首页 > 知识库问答 >
问题:

maven:从JDK中排除jar

应俭
2023-03-14

所以,我已经找了好几个小时了,我完全陷入了困境。

我的问题很简单:我有一个(相当大的)项目,我想用Maven来构建(所以我可以稍微自动化一下)。到目前为止,除了一个主要问题外,一切正常。

我有一个称为“java插件”的依赖项——我不知道它的确切来源或作者,但它在我的依赖项的依赖项中——我将它添加到我们自己的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中有jfxrt。jar(Java FX的一部分)。这一个还包含一个netscape。javascript。JSObjectobject(也是一个netscape.javascript.JSExceptionobject)。它不包含netscape。javascript。另一方面,JSUtil对象。所以Maven从JDK库中获取了JSObjectJSException,以及从我自己的java插件依赖项中获取的其他类。

当然,这两门课不一样。当然,现在我遇到了编译错误,因为java插件依赖项在JSObject类中包含了一个“getWindow”html" target="_blank">方法,而JDK库没有。

理想的情况是排除jfxrt。jar来自Maven,但我完全不知道该怎么做。任何其他解决方案都可以,只要我能用Maven构建这个解决方案。注意:如果可能的话,我不想在Java中使用“背书”机制,因为这需要反复将这个库上传到几个不同的服务器,并且会导致部署的巨大延迟(因为我们总是需要将文件发送给我们的支持团队,以便再次上传)。

谢谢

编辑

因此,我的插件依赖性也存在于JDK中——甚至更好!我不需要我的java插件,我的JDK已经足够了,包括插件。jar自动(在我的${java.home}/lib/plugin.jar中)。

现在我遇到了这样的情况:

正如你所看到的,jfxrt.jar在plugin.jar.之前是第一位的,我明白为什么Maven,或者更一般的Java,一找到第一个netscape.javascript.JSObject(jfxrt.jar)就停止查找。但是我真的需要它来加载第二个JSObject类(不幸的是,它碰巧在同一个包中,并且具有相同的名称)。我该怎么做呢?为什么当我不使用Maven的时候,它在Eclipse中没有魅力,为什么它在IntelliJ和Maven中不起作用?

提前感谢!

共有1个答案

干浩阔
2023-03-14

好吧,我想出来了。显然,这更像是一个IntelliJ问题,而不是类路径问题。

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

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

当我使用一个旧的JDK时,它就可以工作了——这个jfxrt。jar仅添加到JDK7中。

如果我还有我的java插件的话,它在Jenkins上也能工作。jar来自Maven,因为Jenkins不会自动添加JDK库(只添加核心)。我就是这样澄清的:

>

<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中仍然存在问题,但我是来删除jfxrt的。jar来自IntelliJ本身中导入的JDK库,这确实改变了。iml文件,但当然不是对詹金斯有用的任何东西。(右键单击外部库可以编辑这些设置。)

神奇的是,它现在对詹金斯也有效。我尝试并删除了对插件的依赖。jar,然后我在Jenkins上得到了经典的“找不到符号”编译错误——而在IntelliJ中我没有得到这个错误,因为在类路径上自动导入了JDK。

长话短说:通过在IntelliJ中编辑我的项目设置,我让它在本地工作,通过简单地信任Maven,我让它在Jenkins上工作,这是它应该的方式。

 类似资料:
  • 问题内容: 我有一个项目,该项目依赖于由供应商控制的工件。该工件包含一些我依赖的类,其中一些类较旧并且会引起问题。有没有办法让Maven自动扩展jar,删除类并将它们重新打包为依赖项?我会举一个例子。 所以- 我需要使用在项目网站,但我需要使用从神器。我无法修改Supplier:artifact或us:dependency。 有任何想法吗?! 问题答案: 从版本2.0.9开始,maven保留了类路

  • 试图从我的构建中提取文件夹,但以下操作不起作用: 有什么想法吗?

  • 我在maven中配置了一个项目,代码分析是由Sonarqube完成的。 我试图在pom.xml文件中配置SonarQube,以便从代码分析中排除一些文件。这些文件可以通过它们的类名来标识,它们在扩展名之前包含下划线字符(它们是元模型类)。下面我给出了pom.xml文件中我试图排除它们的部分: 但是,上面的代码不起作用。是否有一种方法可以从我的pom.xml文件中配置SonarQube,以便在分析源

  • 我在我的项目中遇到了依赖关系冲突的问题。特别是,slf4j日志记录有两种实现:slf4j-简单和logback-经典,我得到了 在运行时。 logback-classic对我来说是必备的依赖项(因为dropwizard),但slf4j-simple不是真的,我想把它从我的uber项目中去掉。只是没那么容易。 我的“uber jar”依赖于“small jar”,而“small-jar”又依赖于“s

  • 在我们的模块(比如说XYZ)中,我们包含了一个maven toolchains插件的依赖项,以使我们的Jenkins构建使用特定的JDK版本运行。但是,当我们在另一个项目中将XYZ模块作为依赖项包含时,一旦我们包含了这个工具链依赖项,它就会进一步引入许多其他依赖项(见下面的屏幕截图)。 其中一些依赖于工具链,如和会导致SLF4J:类路径包含多个SLF4J绑定等问题。当我们部署应用程序时。 我们为工

  • 问题内容: 我在maven中配置了一个项目,代码分析由SonarQube完成。 我正在尝试在pom.xml文件中配置SonarQube,以从代码分析中排除一些文件。这些文件可以通过其类名来标识,它们在扩展名之前包含下划线字符(它们是元模型类)。下面,我给出了pom.xml文件的一部分,在其中尝试排除它们: 但是,以上代码不起作用。有没有一种方法可以从我的pom.xml文件中配置SonarQube以