maven3實戰之maven使用入門(打包和運行)
----------
將項目進行編譯,測試之后,下一個重要步驟就是打包。pom.xml中如果沒有指定打包類型,默認打包類型為:jar。我們可以簡單地執行命令打包: mvn clean pachage。
類似地,maven會在打包之前執行編譯,測試等操作。如以打jar包為例,jar:jar任務負責打包,實際上就是jar插件的jar目標將項目主代碼打包成一個名為xxxxxx-1.0-SNAPSHOT.jar的文件。該文件也位于target/輸出目錄中,它是根據artifact-version.jar的規則進行命名的,如有需要,還可以使用finalName來自定義該文件的名稱,這里暫且不展開,后面會詳細解釋。
在打包之后,又執行了安裝任務install:install。從輸出可以看到任務將項目輸出的jar安裝到了maven本地倉庫中,可以打開相應的文件夾看到項目的pom和jar。之前我們說只有構件被下載到本地倉庫后,才能由所有Maven項目使用,這里同樣的道理,只有將自己編寫的項目安裝到本地倉庫之后,其他maven項目才能使用它。
我們已經體驗了maven最主要的命令:mvn clean compile,mvn clean test,mvn clean package,mvn clean install。執行test之前是會先執行compile的,執行package之前是會先執行test的,而類似地,install之前會執行package。可以在任何一個maven項目中執行這些命令。
默認打包是生成jar的,如果我的項目還有main方法的,我想打包成可執行的jar包,為了生成可執行的jar文件,需要借助maven-shade-plugin,配置該插件如下:
Xml代碼

- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-shade-plugin</artifactId>
- <version>1.2.1</version>
- <executions>
- <execution>
- <phase>package</phase>
- <goals>
- <goal>shade</goal>
- </goals>
- <configuration>
- <transformers>
- <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
- <mainClass>com.juvenxu.mvnbook.helloworld.HelloWorld</mainClass>
- </transformer>
- </transformers>
- </configuration>
- </execution>
- </executions>
- </plugin>
默認打包生成jar是不能夠直接運行的,因為帶有main方法的類信息不會添加到manifest中(打開jar文件中的META-INF/MANIFEST.MF文件,將無法看到Main-Class一行)。
plugin元素在POM中的相對位置應該在<project><build><plugins>下面。我們配置了mainClass為com.juvenxu.mvnbook.helloworld.HelloWorld,項目在打包時會將該信息放到MANIFEST中。現在執行mvn clean install,待構建完成之后打開target/目錄,可以看到hello-world-1.0-SNAPSHOT.jar和original-hello-world-1.0-SNAPSHOT.jar,前者是帶有Main-Class信息的可執行jar,后者是原始的jar,打開hello-world-1.0-SNAPSHOT.jar的META-INF/MANIFEST.MF,可以看到它包含這樣一行信息:
Main-Class:com.juvenxu.mvnbook.helloworld.HelloWorld
現在,在項目根目錄中執行該jar文件:
D:\code\hello-world > java-jar target\hello-world-1.0-SNAPSHOT.jar,可以得到正確的輸出了。
1:創建名為:helloword的maven項目
2:/helloword/src/main/java下建立package包hello,在包下建類SayHello
package hello;
public class SayHello {
public String sayhello() {
System.out.println("hello............is anybody here...");
return "dddddddddddddddddddddddddd";
}
public static void main(String[] arg) {
System.out.println(new SayHello().sayhello());
}
}
3:/helloword/src/test/java下建立test包,在test包下建HelloWordTest類
package test;
import hello.SayHello;
import junit.framework.Assert;
import junit.framework.TestCase;
public class HelloWordTest extends TestCase {
public HelloWordTest(String name) {
super(name);
}
protected void setUp() { //進行初始化的任務
}
/**
* @param args
*/
public void testSayHello()
{
SayHello s = new SayHello();
String r = s.sayhello();
Assert.assertEquals("dddddddddddddddddddddddddd", r);
}
}
4:pom.xml配置
<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.houwen.test</groupId>
<artifactId>helloword</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>Maven Helloword</name>
<!--junit依賴是為tset準備,配置后,記得install,把依賴包嵌入resourse內,-->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<!--maven-shade-plugin
而要得到一個可以直接在命令行通過java命令運行的JAR文件,還要滿足兩個條件:
JAR包中的/META-INF/MANIFEST.MF元數據文件必須包含Main-Class信息。
Maven有好幾個插件能幫助用戶完成上述任務,不過用起來最方便的還是maven-shade-plugin,它可以讓用戶配置Main-Class的值,然后在打包的時候將值填入/META-INF/MANIFEST.MF文件。關于項目的依賴,它很聰明地將依賴JAR文件全部解壓后,再將得到的.class文件連同當前項目的.class文件一起合并到最終的CLI包中,這樣,在執行CLI JAR文件的時候,所有需要的類就都在Classpath中了。下面是一個配置樣例:
-->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>1.2.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>hello.SayHello</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
4.1上述例子中的,運行maven package后
我的Main-Class是hello.SayHello,構建完成后,對應于一個常規的helloword-0.0.1-SNAPSHOT.jar文件,我還得到了一個original-helloword-0.0.1-SNAPSHOT.jar文件。最后,我可以通過helloword-0.0.1-SNAPSHOT.jar命令運行程序。
4.2之后再運行maven install,把生成的jar打入到本地的maven倉庫,可以在C:\Documents and Settings\hcen\.m2\repository\com\houwen\test\helloword\0.0.1-SNAPSHOT
找到helloword-0.0.1-SNAPSHOT.jar
5.最后,我可以通過java -jar (jar包路徑)/helloword-0.0.1-SNAPSHOT.jar命令運行程序。
用Maven生成一個包孕所有依賴jar包的可執行的jar包
create an executable jar with dependencies using Maven:
using plugin - onejar-maven-plugin. Example below (mvn package build jar):
<plugin>
<groupId>org.dstovall</groupId>
<artifactId>onejar-maven-plugin</artifactId>
<version>1.3.0</version>
<executions>
<execution>
<configuration>
<mainClass>com.company.MainClass</mainClass>
</configuration>
<goals>
<goal>one-jar</goal>
</goals>
</execution>
</executions>
</plugin>
You need to add repository for that plugin:
<pluginRepositories>
<pluginRepository>
<id>onejar-maven-plugin.googlecode.com</id>
<url>http://onejar-maven-plugin.googlecode.com/svn/mavenrepo</url>
</pluginRepository>
</pluginRepositories>