我很高兴使用assembly
插件,除了我想更改-jar-with-dependencies
部分以获得更简单的-with-dependencies
。
由于我想要发布两个(胖子和普通的)罐子,我试图切换到shade
插件。
(我发现使用程序集插件实现的解决方案只有在我选择只发布胖罐时才有效)
我觉得shade
插件缺少archive
插件使用的assembly
部分,并且它对清单操作的支持不太好。
在那个<archive>
部分中,我可以通过不使用<addClassPath>
来选择使类路径无效(对于胖jar,类路径似乎无关紧要)。
我也可以选择使用可能为null的属性指定Main-Class,在这种情况下,不会添加清单条目。
<archive>
<manifest>
<mainClass>${one-jar.mainClass}</mainClass>
</manifest>
</archive>
使用shade
插件,我找不到这些款待。
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<manifestEntries>
<Main-Class>${one-jar.mainClass}</Main-Class>
<Class-Path>.</Class-Path>
</manifestEntries>
</transformer>
</transformers>
问题:
如果我不尝试静默Class-Path(使用上面的技巧快速拍摄它),原始的类路径将被写入清单,这对于一个自包含的jar来说是毫无用处的。
如果未定义${one-jar.mainClass}
(如在非可执行的胖jar中,在本例中为MapReduce jar),则使用assembly
插件很好地省略清单条目,但设置为{{1在(null)
插件中:后者使运行jar失败。
shade
为什么不删除该条目?
这个插件部分实际上存放在我的root pom.xml中,它包含各种不相关项目使用的大量插件设置,目的是不必在这些项目中重写整个插件部分。
我可以继续指定[hdfs@manager ~]$ hadoop jar ~/mapreduce-with-dependencies.jar path.to.my.MainClass …
Exception in thread "main" java.lang.ClassNotFoundException: null
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
…/…
,即使这是一个糟糕的解决方法,但我不想仅仅因为这个问题而在我的子项目中重写<Class-Path>.</Class-Path>
配置。
我宁愿回到使用shade
插件 - 除非我遗漏了什么!
我是吗?
感谢您的想法和帮助:)