Maven打包可執行Jar的幾種方法
阿新 • • 發佈:2019-02-17
一、無依賴其他任何jar
<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.think.TestMain</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
執行:mvn clean package,在target中找到打包出來的,命令後執行java -jar xxx.jar即可,但是如果程式有依賴其他包,比如程式依賴jdbc去查詢db,這時候再執行就會出現找不到jdbc依賴,因為我們並沒有將依賴包打進去
二、解決依賴其他包時,可執行jar的打包
1、
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.3</version>
<configuration>
<appendAssemblyId>false</appendAssemblyId>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>com.think.TestMain</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>assembly</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
但以上方式用的比較少,因為我們依賴的jar,也會打進到我們最終生成的jar,這樣不太好,假如你生成的jar要給別人使用,最好給一個純淨的。
一般用assembly會再用他另外一個功能,將我們的jar歸檔,打包成一個zip
2、打成一個zip包,釋出專案的時候,將zip包copy到伺服器上,直接unzip xxx.zip,裡面包含要執行到jar以及依賴的lib,還有配置的config檔案,即可直接啟動服務
<build>
<resources>
<!-- 控制資原始檔的拷貝 -->
<resource>
<directory>src/main/resources</directory>
<targetPath>${project.build.directory}/classes</targetPath>
</resource>
</resources>
<plugins>
<!-- 設定原始檔編碼方式 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
<encoding>UTF-8</encoding>
</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>
<!--
生成的jar中,不要包含pom.xml和pom.properties這兩個檔案
-->
<addMavenDescriptor>false</addMavenDescriptor>
<!-- Manifest specific configuration -->
<manifest>
<!--
是否要把第三方jar放到manifest的classpath中
-->
<addClasspath>true</addClasspath>
<!--
生成的manifest中classpath的字首,因為要把第三方jar放到lib目錄下,所以classpath的字首是lib/
-->
<classpathPrefix>lib/</classpathPrefix>
<!--
應用的main class
-->
<mainClass>com.think.TestMain</mainClass>
</manifest>
</archive>
<!--
過濾掉不希望包含在jar中的檔案
-->
<!--<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>src/main/assembly/assembly.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
還有一個重要的檔案,名字可以隨便起,我上面用的是 src/main/assembly/assembly.xml
<assembly>
<id>bin</id>
<includeBaseDirectory>false</includeBaseDirectory>
<!-- 最終打包成一個用於釋出的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>-->
<!--</fileSet>-->
<!-- 把專案的配置檔案,打包進zip檔案的config目錄 -->
<fileSet>
<directory>${deploy.dir}/classes/</directory>
<outputDirectory>/conf</outputDirectory>
<includes>
<include>*.xml</include>
<include>*.properties</include>
</includes>
</fileSet>
<!-- 把專案自己編譯出來的jar檔案,打包進zip檔案的根目錄 -->
<fileSet>
<directory>${project.build.directory}</directory>
<outputDirectory></outputDirectory>
<includes>
<include>*.jar</include>
</includes>
</fileSet>
</fileSets>
</assembly>
最終執行命令:mvn clean package,出來的是這樣的
解壓zip包,我們看到我們想要的,good
3、還有一種打包方式,上面相當於把我們想要的東西打成一個zip包,全部放到一起,看著整潔好看,但有點繁瑣,我們其實可以用另外一個外掛來完成,不打包,即看到上圖解壓後的檔案
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.test</groupId>
<artifactId>myTestJar</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>myTestJar</name>
<url>http://maven.apache.org</url>
<properties>
<deploy.dir>./target/</deploy.dir>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.9</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.32</version>
</dependency>
</dependencies>
<build>
<finalName>myTest</finalName>
<sourceDirectory>src/main/java</sourceDirectory>
<resources>
<!-- 控制資原始檔的拷貝 -->
<resource>
<directory>src/main/resources</directory>
<targetPath>${project.build.directory}</targetPath>
</resource>
</resources>
<plugins>
<!-- 設定原始檔編碼方式 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<defaultLibBundleDir>lib</defaultLibBundleDir>
<source>1.6</source>
<target>1.6</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<!-- 打包jar檔案時,配置manifest檔案,加入lib包的jar依賴 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>com.think.TestMain</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<!-- 拷貝依賴的jar包到lib目錄 -->
<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>
<!-- ${project.build.directory}是maven變數,內建的,表示target目錄,如果不寫,將在跟目錄下建立/lib -->
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<!-- excludeTransitive:是否不包含間接依賴包,比如我們依賴A,但是A又依賴了B,我們是否也要把B打進去 預設不打-->
<excludeTransitive>true</excludeTransitive>
<!-- 複製的jar檔案去掉版本資訊 -->
<stripVersion>true</stripVersion>
</configuration>
</execution>
</executions>
</plugin>
<!-- 解決資原始檔的編碼問題 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.3</version>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<!-- 打包source檔案為jar檔案 -->
<plugin>
<artifactId>maven-source-plugin</artifactId>
<version>2.1</version>
<configuration>
<attach>true</attach>
<encoding>UTF-8</encoding>
</configuration>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
這裡採用的是maven-dependency-plugin外掛,進行資源的copy。
4、
<build>
<resources>
<resource>
<targetPath>${project.build.directory}/classes</targetPath>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.0</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.think.TestMain</mainClass>
</transformer>
<!--<transformer-->
<!--implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">-->
<!--<resource>applicationContext.xml</resource>-->
<!--</transformer>-->
</transformers>
<shadedArtifactAttached>true</shadedArtifactAttached>
<shadedClassifierName>executable</shadedClassifierName>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
這種方式打出來是柔和到一起,成為一個jar,
可以直接java -jar xxx.jar執行。
我們可以根據不同需要來打包,如果暴露給外面,可以採用第4種,如果是自己公司專案打包,建議2,3種,因為有時候只是改了個配置檔案,不需要打包,直接把配置檔案複製進去即可
原文地址:http://m.blog.csdn.net/article/details?id=51871705