對於Maven項目來說,日常使用的多數第三方java庫文件都可以從Maven的Central Repository中自動下載,但是如果我們需要的jar文件不在Central Repository中,那么我們就需要手動將自己下載的jar文件加入到Maven的local reposotory中了,此時我們需要向Maven提供用於識別jar文件(可能多個)的groupId, artifactId和version等信息。
我並不打算講怎么將一個下載的jar庫加入到local repository中,我們將自己建立一個jar庫,比如我們有一個最簡單的HelloWorld類HelloWorld.java:
package com.thoughtworks.davenkin;
public class HelloWorld
{
public void sayHello()
{
System.out.println("Hello, World");
}
}
我們希望將HelloWorld.java打包成jar文件安裝在Maven的local repository中以便其它程序使用。
編譯打包hello-world.jar后,為了符合Maven的規定,需要給hello-world.jar一個版本號,故將hello-world.jar改名為hello-world-1.0.jar,此后便可以用mvn來安裝此包到Maven的local repository中了:
mvn install:install-file -Dfile=path/to/hello-world-1.0.jar -DgroupId=com.thoughtworks.davenkin -DartifactId=hello-world -Dversion=1.0 -Dpackaging=jar
其中,-Dfile選項應給出需要安裝jar文件的路徑,在Linux/Mac下,jar文件將被安裝在以下目錄:
~/.m2/repository/com/thoughtworks/davenkin/hello-world/1.0/hello-world-1.0.jar
現在,我們的hello-world-1.0.jar便可以被其它Maven項目所使用了,為此創建一個Maven工程:
mvn archetype:generate-DgroupId=com.thoughtworks.davenkin.demo -DartifactId=helloworld-demo -DarchetypeArtifactId=maven-archetype-quickstart -Dversion=1.0
此時將在當前目錄下自動創建helloworld-demo子目錄,切換到helloworld-demo目錄,刪除已有的App.java,並創建自己的Main.java文件
rm src/main/java/com/thoughtworks/davenkin/demo/App.java
touch src/main/java/com/thoughtworks/davenkin/demo/Main.java
將以下內容加入到Main.java文件中:
package com.thoughtworks.davenkin.demo;
import com.thoughtworks.davenkin.HelloWorld;
public class Main
{
public static void main(String[] args)
{
new HelloWorld().sayHello();
}
}
接下來是最重要的一步,修改pom.xml文件以加入對HelloWorld類的依賴:
<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.thoughtworks.davenkin.demo</groupId>
<artifactId>demo</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<name>demo</name>
<url>http://maven.apache.org</url>
<properties>
<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.thoughtworks.davenkin</groupId>
<artifactId>hello-world</artifactId>
<version>1.0</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
以上高亮部分為我們手動加入的,Maven會根據artifactId和version拼出所依賴jar包的名字,即artifactId-version.jar,對於我們的例子,artifactId為hello-world,version為1.0,所得到的jar文件為hello-world-1.0.jar,這也是為什么我們在一開始時需要將hello-world.jar的名字改為hello-world-1.0.jar的原因。
接下來便可以編譯我們的Main.java了:
mvn compile
編譯結果會放在target文件夾下。
到現在,我們的例子便可以運行了,在工程根目錄下(該例為hello-world-demo)輸入以下命令:
mvn exec:java -Dexec.mainClass="com.thoughtworks.davenkin.demo.Main"
在筆者的機器上輸出為:
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building demo 1.0
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] >>> exec-maven-plugin:1.2.1:java (default-cli) @ demo >>>
[INFO]
[INFO] <<< exec-maven-plugin:1.2.1:java (default-cli) @ demo <<<
[INFO]
[INFO] --- exec-maven-plugin:1.2.1:java (default-cli) @ demo ---
Hello, World
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.423s
[INFO] Finished at: Wed Feb 15 21:33:47 CST 2012
[INFO] Final Memory: 5M/81M
[INFO] ------------------------------------------------------------------------
以上高亮部分即為我們期望的程序輸出,當然你也可以用傳統的java命令來運行,此時需要將hello-world-1.0.jar加入到classpath中,輸入:
java -cp ~/.m2/repository/com/thoughtworks/davenkin/hello-world/1.0/hello-world-1.0.jar:target/classes/ com.thoughtworks.davenkin.demo.Main
輸出為:
Hello, World