其實,我沒有檢查maven-shade-plugin
究竟是在做什麼(或任何其他插件),因爲maven 2內置了一切用於創建megajar或uberjar的內容。您只需使用帶有預定義的jar-with-dependencies
描述符的maven-assembly-plugin。
就在這個段添加到您pom.xml
定製清單:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>my.package.to.my.MainClass</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
而下面的命令會在uberjar:
mvn assembly:assembly -DdescriptorId=jar-with-dependencies
但是,再說一次,這個描述符的默認行爲是解壓依賴項(比如maven-shade-plugin)。說實話,我不明白爲什麼這是一個問題,但如果這真的不是你想要的,你可以使用自己的自定義組裝描述符。
要做到這一點,首先,創建裝配描述,讓我們說src/assembly/uberjar.xml
,具有以下內容:
<assembly>
<id>uberjar</id>
<formats>
<format>jar</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<dependencySets>
<dependencySet>
<unpack>false</unpack>
<scope>runtime</scope>
<useProjectArtifact>false</useProjectArtifact>
</dependencySet>
</dependencySets>
<fileSets>
<fileSet>
<directory>${project.build.outputDirectory}</directory>
<outputDirectory>/</outputDirectory>
</fileSet>
</fileSets>
</assembly>
然後,配置Maven的組裝插件來用這個描述和依賴,加入到該Class-Path
進入清單的:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptors>
<descriptor>src/assembly/uberjar.xml</descriptor>
</descriptors>
<archive>
<manifest>
<mainClass>my.package.to.my.MainClass</mainClass>
<addClasspath>true</addClasspath>
</manifest>
</archive>
</configuration>
<!--
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
-->
</plugin>
最後運行mvn assembly:assembly
出示你uberjar。
(可選)取消註釋executions
元素以綁定package
階段上的程序集插件(並使程序集生成爲常規構建的一部分)。
+1,非常有幫助的答案。我可以想象一些軟件生產商,尤其是OS之外的軟件生產商可能會禁止他們的產品進行「拆卸/逆向工程」,或者堅持他們的包裝保持原樣,包括文件名等。 – 2009-12-04 08:53:28
裝配:裝配已被裝配:最近單身。 (我在裝配插件版本2.3) – 2012-10-08 13:57:54
程序集插件是一個插件就像陰影插件,所以它不是「內置」 – 2016-05-15 14:41:31