2009-12-02 15 views
26

我正在嘗試創建一個包含項目類的可執行jar(它使用maven),並且它具有一個清單文件的依賴關係,該文件具有主類和類路徑條目,該條目指向打包在罐子,是這樣的:是否可以創建一個包含項目類和項目依賴關係的「超級」jar作爲帶有自定義清單文件的jar包?

清單文件:

 
..... 
Main-Class : com.acme.MainClass 
Class-Path : dependecy1.jar dependecy2.jar 
..... 

罐:

 
jar-root 
|-- .... 
|-- com/acme/../*.class 
|-- dependecy1.jar 
`-- dependecy2.jar 

我使用Maven的JAR-插件創建的清單文件和Maven的樹蔭 - 插件來創建「UB呃「jar但依賴關係被解壓縮並添加爲類到我的jar。

回答

56

其實,我沒有檢查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階段上的程序集插件(並使程序集生成爲常規構建的一部分)。

+4

+1,非常有幫助的答案。我可以想象一些軟件生產商,尤其是OS之外的軟件生產商可能會禁止他們的產品進行「拆卸/逆向工程」,或者堅持他們的包裝保持原樣,包括文件名等。 – 2009-12-04 08:53:28

+1

裝配:裝配已被裝配:最近單身。 (我在裝配插件版本2.3) – 2012-10-08 13:57:54

+0

程序集插件是一個插件就像陰影插件,所以它不是「內置」 – 2016-05-15 14:41:31

0

我知道,這樣做的兩款產品:

  • 一個被稱爲「bigjar」,但是這太籠統,在谷歌搜索有用的一個術語;我無法找到它。
  • 另一個叫做'onejar'。有不少參考資料,它聲稱做你需要的。

下面是從別人後誰在Maven的組件使用OneJar:

http://5341.com/list/55/498657.html

2

我已經在過去使用FatJar這一點。 http://fjep.sourceforge.net/

我已經創建了一個相對簡單的應用程序,客戶端將要雙擊可執行文件並使其正常工作。安裝程序或依賴關係是不可能的。 Fatjar將Eclipse中的項目庫和引用文件捆綁到幾兆字節的可執行jar中。無瑕。

+0

這是一個Eclipse插件嗎?如果是這樣,我不明白它是如何回答這個問題的。該OP是要求一個maven解決方案... – 2009-12-02 18:37:46

+0

你是對的,我誤解了那部分。我猜想我認爲它可以應用於其他領域,因爲所有的IDE都只不過是腳本包裝的包裝。 – Karl 2009-12-02 18:52:33

相關問題