1. 程式人生 > >Maven手動構建jar包

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>