Intellij构建与maven构建不同

时间:2015-12-14 00:40:33

标签: java maven intellij-idea

当我通过mvn package从命令行编译超级jar并使用java -jar target/my-jar.jar执行时,它会因某些依赖性冲突而失败。

当我从run / debug配置执行时,使用Intellij的make,一切都很好!

Intellij的类路径有什么不同吗?我如何才能找出两个版本之间的差异?

1 个答案:

答案 0 :(得分:1)

我自己弄清楚了,并且沿途学到了很多东西。问题原来是我使用

的maven shade插件
<transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>

即使您虔诚地排除了传递依赖性,该变换器仍会连接传递定义的类,并且可能导致hk2无法找到注入依赖项所需的类的问题。我排除了一些类,以防止我的应用程序运行Jersey 1和Jersey 2.删除该行修复了我的内容并匹配Intellij中的行为。

mvn package生成的工件与使用Intellij运行构建之间的一些潜在差异:

  • Intellij不生产jar,因此没有META-INF目录。当使用jersey和maven shade插件时,META-INF / services目录通常由hk2依赖项扫描以进行依赖注入。
  • 在Intellij中进行构建不会经历maven生命周期。如果您依赖特定的maven插件或构建步骤来运行您的应用程序,那么您必须让它执行maven生命周期步骤而不是IDE的制作。
  • Intellij(目前版本15)和maven之间存在轻微的范围差异。我通过比较mvn dependency:list -Dsort=true并在项目设置&gt;中对屏幕进行排序来发现这一点。模块&gt; {your module}&gt;依赖项(tab)。
  • maven发现了一些在Intellij中没有的传递依赖,反之亦然。我使用dependency:listdependency:tree -Dincludes=the.groupIid:the.artifact来跟踪某些传递依赖项的来源。