最后,如果我使用来构建您的项目,并向
pom.xml您展示了
apache-poiafter
jfreechart,则向我们展示了,那么正如您所提到的,我得到了一个损坏的JAR。交换这两个依赖关系的顺序确实可以为我提供正确的JAR。
我以前有一些关于的经验,
maven-shade-plugin使用时遇到了创建的JAR
meta-INF目录的麻烦,因此我检查了其中的缺陷。
我试图将目录复制(使用Total Commander)在
meta-INF本地文件系统上的某个位置,并且我注意到在复制中的文件时出错
meta-INF/licences/。如果我尝试将它们分别复制到某个地方并且可以工作,但无法复制整个内容。我的结论是JAR / ZIP存档已损坏。
我所做的是我 进入 在Total Commander是JAR(
Ctrl+
PgDown以上 的JAR文件),我 改名
thirdpartylicenses.txt到
thirdpartylicenses.txt.wtf。这样做,Total
Commander可以保存并重新打包JAR(我已经安装了Total7zip Total Commander Packer插件-
如果有人尝试过但不起作用,请尝试安装此插件)。
在这之后。有用。
(我也尝试过使用Cygwin的
unzip/
zip命令重新打包整个内容而不重命名任何内容,但这没用,新的存档仍然损坏。TotalCommander或我提到的插件确实起到了一定的作用。)
我猜这
maven-shade-plugin仅仅是创建一个损坏或无效的ZIP /
JAR存档。我不确定为什么,也许我所描述的内容不适用于其他任何人,但我想我会提到它,以便也许我可以提供帮助。
我不能只留下这个,所以我更深入地研究了,我想我找到了答案。
该 坏 JAR包含65608个词条。在 良好的 JAR包含65450个词条。
猜猜一个 普通
ZIP文件的条目数上限是多少?是的
Wiki文章谈到了克服此限制的ZIP64格式。
在 良好的
JAR少项,因为实际的依赖关系,因为在你的依赖声明的位置的改变
pom.xml。
作为对Seanizer的commons-lang答案的反驳,如果您使用的是Google的Guava库(在许多方面,我认为它是commons-lang的“后继者”),则可以使用Joiner:
Joiner.on(" ").join(set_1);借助一些辅助方法来执行以下操作:
Joiner.on(" ").skipNulls().join(set_1);// If 2nd item was null, would produce "1, 3"要么
Joiner.on(" ").useForNull("<unknown>").join(set_1);// If 2nd item was null, would produce "1, <unknown>, 3"它还支持直接附加到StringBuilders和Writers以及其他类似功能。
我已经数过像这样的条目。
Collections.list(new JarFile("...").entries()).size();我使用的Java7似乎支持新的ZIP64格式,因此,如果有人尝试使用Java
5或6 来计算 不良 JAR中的条目,则会收到错误消息(不过我不确定)。
我还试图运行JAR 爆炸 。我已经将整个JAR解压缩到一个目录中,然后像这样运行整个程序。
java -cp <dir/ com.mycompany.test.Start
像魅力一样工作。
底线。不要 过度使用 了
maven-shade-plugin。
我有一个正在工作的项目,在那里我要像这样构建我的项目。
- 我使用复制我项目的依赖项
maven-dependency-plugin
。签出copy-dependencies
目标。target/dependency
如果我没记错的话,这会将您的依赖项复制到其中。 - 使用
maven-jar-plugin
I 在插件配置中使用这些选项将这些依赖项MANIFEST.MF
作为Class-Path
条目添加到最终的JAR 中。
<classpathPrefix>dependency/</classpathPrefix> <addClasspath>true</addClasspath>
因此,我将
Class-Path输入
dependency/<artifactId>-<version>.jar,等。
- After this I’m using the
maven-assembly-plugin
to create a distribution ZIP which contains my final JAR and the wholedependency/
folder. - When I deploy my application I can run it like
java -jar final.jar
.
Primarily I’ve opted to use this solution, because in my project I use some
Bouncy Castle JARs which JARs have some extravagant this and that inside
their
meta-INFdirectory. When I used the
maven-shade-pluginto create my
final runnable JAR all hell broke loose and I got nasty that method couldn’t
be found and this signature is not quite right errors.
You should be doing something like this also. This Maven shade business is too
shady to be useful (pun intended).
Here’s a blog post on the whole process that I’ve tried to
describe just above (thanks to
baba), maybe it’ll help someone
in the future.



