【问题标题】:javax/inject/Inject.class in lib/javax.inject-1.jar is hidden by lib/javax.inject-2.5.0-b42.jar on onejar executablelib/javax.inject-1.jar 中的 javax/inject/Inject.class 被 onejar 可执行文件上的 lib/javax.inject-2.5.0-b42.jar 隐藏
【发布时间】:2018-05-27 22:12:01
【问题描述】:

我正在尝试创建一个原子可执行 jar(即 jar 之外没有依赖项)。

为此,我在我的 pom.xml 中添加了一个 com.jolira:onejar-maven-plugin。这似乎可以完成这项工作,但是当我执行 jar 时,我会收到警告: JarClassLoader:警告:来自关联的输入流的空清单:lib/javax.inject-1.jar JarClassLoader:警告:lib/javax.inject-1.jar 中的 javax/inject/Inject.class 被 lib/javax.inject-2.5.0-b42.jar 隐藏(使用不同的字节码) JarClassLoader:警告:lib/javax.inject-1.jar 中的 javax/inject/Named.class 被 lib/javax.inject-2.5.0-b42.jar 隐藏(使用不同的字节码)

似乎我的依赖项同时引入了 javax.inject-1.jar 和 javax.inject-2.5.0-b42.jar。为了验证这一点,我检查了两者都已经/正在从存储库下载。我当然没有在依赖项中列出两者,因此必须有一些隐含的依赖项 AFAICS。

任何人都知道是否有办法从 maven 依赖项中仅排除一个 jar,或者阻止 onejar-maven-plugin 将其包含在可执行 jar 中?

有没有更好的方法来创建一个原子(或有人称它们为胖)jar,java 加载器实际上可以从嵌入式 jar 加载。我一整天都在尝试各种不同的食谱,而 onejar 是唯一真正让加载工作的食谱。

【问题讨论】:

    标签: maven jar executable-jar onejar


    【解决方案1】:

    玩了一段时间后,我发现 Alex 的解决方案是正确的,只是我将排除项放在了错误的位置。解决办法就是放在这里:

    <dependency>
      <groupId>org.glassfish.jersey.inject</groupId>
      <artifactId>jersey-hk2</artifactId>
      <version>2.26</version>
      <exclusions> <!--  exclude exclude javax.inject-1.jar -->
        <exclusion>
          <groupId>javax.inject</groupId>
          <artifactId>javax.inject</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    

    【讨论】:

      【解决方案2】:

      只是把它放在这里以备将来使用。 我以这种方式解决了这个问题: (这是针对项目的依赖项,它在自己的依赖项中有 javax.inject)

      <exclusion>
          <groupId>javax.inject</groupId>
          <artifactId>javax.inject</artifactId>
      </exclusion>
      

      【讨论】:

      • 我尝试了您的解决方案,但似乎没有帮助。把这个放到 onejar-maven-plugin 中?
      • 它是针对项目的依赖项,它在自己的依赖项中有 javax.inject
      猜你喜欢
      • 2018-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-02
      相关资源
      最近更新 更多