1. 程式人生 > >將Maven專案打包成可執行jar檔案(引用第三方jar)

將Maven專案打包成可執行jar檔案(引用第三方jar)

http://blog.csdn.net/zhangdaiscott/article/details/6911640

方法一. mvn assembly 或 mvn package (一個jar包)

把依賴包和自己專案的檔案打包如同一個jar包(這種方式對spring的專案不支援)
  <build>
      <plugins>
          <plugin>
              <artifactId>maven-assembly-plugin</artifactId>
              <configuration>
                  <archive>
                      <manifest>
                          <mainClass>com.tang.CSVUtils</mainClass>
                      </manifest>
                  </archive>
                  <descriptorRefs>
                      <descriptorRef>
                          jar-with-dependencies
                      </descriptorRef>
                  </descriptorRefs>
              </configuration>
              <!-- 加上下面這一段,使用 mvn package命令,不加則使用mvn assembly-->
              <!-- <executions>   
                  <execution>
                      <id>make-assemble</id>
                      <phase>package</phase>
                      <goals>
                          <goal>single</goal>
                      </goals>
                  </execution>
              </executions> -->
          </plugin>
      </plugins>
  </build>
Eclipse 中 Run As--- Maven clean ---Maven assembly:assembly(或 Maven package)

Target目錄生成如下檔案:

其中,

testLog4j-0.1.jar 是不可直接執行的,因為沒有帶第三方包。

testLog4j-0.1-jar-with-dependencies.jar 就是帶有第三方包的可執行 jar 包,

在命令列執行 java -jar testLog4j-0.1-jar-with-dependencies.jar 即可執行

方法二:mvn package(一個jar包和一個lib資料夾)

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>2.4</version>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <classpathPrefix>lib/</classpathPrefix>
                        <mainClass>com.tang.CSVUtils</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
                <execution>
                    <id>copy</id>
                    <phase>package</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>${project.build.directory}/lib</outputDirectory>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>  

執行maven package 進行打包進入target目錄。

其中lib就是第三方jar包的目錄,在其他專案引入testLog4j-0.1.jar會自動找到並引入lib裡面的包.

只需要拷貝這兩個(lib和testLog4j-0.1.jar)即可放到其他地方用了。

在命令列執行:java -jar testLog4j-0.1.jar


方法三:mvn package(推薦)(一個zip包,裡面有一個jar包,一個lib資料夾,和一個conf資料夾)

(1)conf/package.xml (conf 資料夾和pom.xml在同一級目錄)
<assembly>  
    <id>bin</id>  
    <!-- 最終打包成一個用於釋出的zip檔案 -->  
    <formats>  
        <format>zip</format>  
    </formats>  
  
    <!-- Adds dependencies to zip package under lib directory -->  
    <dependencySets>  
        <dependencySet>  
            <!-- 
               不使用專案的artifact,第三方jar不要解壓,打包進zip檔案的lib目錄 
           -->  
            <useProjectArtifact>false</useProjectArtifact>  
            <outputDirectory>lib</outputDirectory>  
            <unpack>false</unpack>  
        </dependencySet>  
    </dependencySets>  
  
    <fileSets>  
        <!-- 把專案相關的說明檔案,打包進zip檔案的根目錄 -->  
        <fileSet>  
            <directory>${project.basedir}</directory>  
            <outputDirectory>/</outputDirectory>  
            <includes>  
                <include>README*</include>  
                <include>LICENSE*</include>  
                <include>NOTICE*</include>  
            </includes>  
        </fileSet>  
          
        <!-- 把專案的配置檔案,打包進zip檔案的config目錄 -->  
        <fileSet>  
            <directory>${project.basedir}\conf</directory>  
            <outputDirectory>conf</outputDirectory>  
            <includes>  
                <include>*.xml</include>  
                <include>*.properties</include>
                <include>*.key</include> 
            </includes>  
        </fileSet>  
          
        <!-- 把專案的指令碼檔案目錄( src/main/scripts )中的啟動指令碼檔案,打包進zip檔案的跟目錄 -->  
        <fileSet>  
            <directory>${project.build.scriptSourceDirectory}</directory>  
            <outputDirectory></outputDirectory>  
            <includes>  
                <include>startup.*</include>  
            </includes>  
        </fileSet>  
  
        <!-- 把專案自己編譯出來的jar檔案,打包進zip檔案的根目錄 -->  
        <fileSet>  
            <directory>${project.build.directory}</directory>  
            <outputDirectory></outputDirectory>  
            <includes>  
                <include>*.jar</include>  
            </includes>  
        </fileSet>  
    </fileSets>  
</assembly>


(2)pom.xml
<build>  
      <plugins>
		<plugin>
		      <groupId>org.apache.maven.plugins</groupId>
		      <artifactId>maven-compiler-plugin</artifactId>
		      <version>3.1</version>
		      <configuration>
		          <compilerVersion>1.6</compilerVersion>
		          <source>1.6</source>
		          <target>1.6</target>
		      </configuration>
		 </plugin>  
          <!-- The configuration of maven-jar-plugin -->  
        <plugin>  
            <groupId>org.apache.maven.plugins</groupId>  
            <artifactId>maven-jar-plugin</artifactId>  
            <version>2.4</version>  
            <!-- The configuration of the plugin -->  
            <configuration>  
                <!-- Configuration of the archiver -->  
                <archive>  
  
                    <!-- do not include pom.xml and pom.properties in the jar package -->  
                    <addMavenDescriptor>false</addMavenDescriptor>  
  
                    <!-- Manifest specific configuration -->  
                    <manifest>  
                    
                        <!-- put third party jar package into the classpath of manifest -->  
                        <addClasspath>true</addClasspath>  
                        <!-- the prefix of the jar items in the classpath, it depends on the location(folder) of jar files -->  
                        <classpathPrefix>lib/</classpathPrefix>  
                        <!-- main class of the jar package-->  
                        <mainClass>com.tang.your-Main-class</mainClass>  
                    </manifest>  
                </archive>  
                <!-- excludes some files -->  
                <excludes>  
                    <exclude>${project.basedir}/xml/*</exclude>  
                </excludes>  
            </configuration>  
        </plugin>  
  
        <!-- The configuration of maven-assembly-plugin -->  
        <plugin>  
            <groupId>org.apache.maven.plugins</groupId>  
            <artifactId>maven-assembly-plugin</artifactId>  
            <version>2.4</version>  
            <!-- The configuration of the plugin -->  
            <configuration>  
                <!-- Specifies the configuration file of the assembly plugin -->  
                <descriptors>  
                    <descriptor>conf/package.xml</descriptor>  
                </descriptors>  
            </configuration>  
            <executions>  
                <execution>  
                    <id>make-assembly</id>  
                    <phase>package</phase>  
                    <goals>  
                        <goal>single</goal>  
                    </goals>  
                </execution>  
            </executions>  
        </plugin>   
      </plugins>  
  </build>  

mvn install後,此時會在target目錄下生成一個zip檔案,如:  youArtifactId-0.0.1-bin.zip 解壓後有: conf 資料夾, lib資料夾,  youArtifactId-0.0.1-bin.jar