Maven手動構建jar包
Maven手動構建jar包
何為maven
maven是一個純java開發的,用來管理java專案的。其用處:
1、依賴管理,即管理jar包。普通的專案,需要將專案所需的jar包放入libs資料夾中。而maven專案,只需要通過pom檔案即可新增和管理jar包。
2、用於專案的構建。對於一個普通的只包含java原始碼的專案,可以通過maven命令,完成專案的編譯、測試、執行、打包以及部署等。
Maven的目錄結構
Maven構建命令
mvn clean: 清理編譯的檔案,將target目錄刪除
mvn compile: 編譯原始碼
mvn package:打包
mvn test:編譯並執行test目錄下的程式碼
mvn install: 安裝打包檔案到倉庫
mvn tomcat:run 啟動tomcat伺服器
#maven打包可執行的jar檔案
##沒有引用第三方jar包,在pom新增外掛
<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>jarTest.JavaTest</mainClass> </manifest> </archive> </configuration> </plugin>
在cmd中,進入專案pom檔案所在目錄,執行
mvn clean
mvn package
進入到target目錄,執行可執行程式
java -jar jarTest-0.0.1-SNAPSHOT.jar
引用了其他jar包的情況(第三方jar包不與package打成一個包)
比如,在專案中引用了netty的jar包,
<dependencies> <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>5.0.0.Alpha1</version> </dependency> </dependencies>
如果仍用上述方法,會報找不到netty包的方法的錯誤。通過在pom檔案中新增如下外掛
<build>
<plugins>
<!-- 設定編譯版本為1.7 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.7</source>
<target>1.7</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<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>jarTest.JavaTest</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檔案去掉版本資訊,最好設定為false -->
<stripVersion>false</stripVersion>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
引用了其他jar包的情況(第三方jar包與package打成一個包)
<build>
<plugins>
<!-- 設定編譯版本為1.7 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.7</source>
<target>1.7</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>jarTest.JavaTest</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>
maven依賴範圍
依賴範圍通過 標籤來確定。
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<scope>provider</scope>
</dependency>
其值可分為以下幾種:
1、compile :從編譯、測試、打包、執行都需要
2、provided:編譯、測試是需要,打包、執行不需要jar包(經常servlet-api和jsp-api會用到這個,因為tomcat伺服器裡有此兩個jar,因此我們在打包時候不需要將這兩個包打進去)
3、runtimer:編譯時候不需要,測試、打包、執行時候需要
4、test: 只有測試時候才需要(junit.jar)
maven對於jar包衝突的處理
1、排除原則 ,通過exclusion標籤
<!-- dubbo相關 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
</exclusion>
<exclusion>
<groupId>org.jboss.netty</groupId>
<artifactId>netty</artifactId>
</exclusion>
</exclusions>
</dependency>
2、版本鎖定。通常在父工程中通過dependencyManagement 統一多模組的依賴版本
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
</dependencyManagement>