lib / javax.inject-1.jar中的javax / inject / Inject.class被lib / javax.inject-2.5.0-b42.jar隐藏在onejar可执行文件

时间:2017-12-13 22:13:06

标签: maven jar executable-jar onejar

我正在尝试创建一个原子可执行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是唯一一个真正得到装载工作的人。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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>