Maven项目的核心是pom.xml。(Project Object Model,项目对象模型)定义了项目的基本信息,用户描述项目如何构建,声明以及依赖等等。现在编写一个HelloWorld的pom.xml。
首先创建一个名为helloworld的文件夹,输入内容:
<?xml version="1.0" encoding="UTF-8"?> <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.lmy</groupId> <artifactId>helloworld</artifactId> <version>1.0-SNAPSHOT</version> <name>Maven Hello World Project</name> </project>
modelVersion元素指定了当前POM模型的版本。
groupId定义了项目属于哪个组,这个组一般和项目所在的组织或者公司的名字存在关联,比如在googlecode上建立一个名为myapp的项目,那么groupId就应该是com.goolecode.myapp。
artifactId定义了当前Maven项目在组中唯一的ID。
version则是指定当前的版本---1.0.SNAPSHOT。SNAPSHOT意思为快照,说明该项目还在研发中,是不稳定的版本。
最后一个name是对用户提供一个友好的项目名称,虽然不是必须的,但是推荐为每个pom.xml添加name。
主代码:
Maven假设项目主代码位于src/main/java目录,我们遵循这个约定,创建该目录,在该目录下创建com/lmy/helloworld/HelloWorld.java,内容如下:
package com.lmy.helloworld; public class HelloWorld{ public String sayHello(){ return "Hello World"; } public static void main(String[] args){ System.out.println(new HelloWorld().sayHello()); } }
这段java代码需要注意两个地方,首先,大多数情况下,应该把项目的主代码放在src/main/java目录下(Maven的约定),无需额外的配置,Maven会自动搜索该目录找到项目主代码,其次java类的包名应该是com.lmy.helloworld,和之前在pom.xml中定义的groupId和artifactId相吻合。
然后在项目根目录下(pom.xml和src所在目录)运行命令mvn clean compile,输出如下结果
clean会告诉maven清理输出目录target,compile会告诉maven编译项目主代码,从输出中可以看到先执行了clean,删除target目录。默认情况下,maven构建的所有输出都在target/,接着resources:resources,最后执行compile:compile任务,将项目主代码编译到target/classes目录下。
测试代码:
maven项目中测试代码的默认目录是src/test/java。创建该目录。
使用junit进行测试,首先需要为项目添加junit的依赖包。修改pom.xml的代码。
<?xml version="1.0" encoding="UTF-8"?> <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.lmy</groupId> <artifactId>helloworld</artifactId> <version>1.0-SNAPSHOT</version> <name>Maven Hello World Project</name> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.7</version> <scope>test</scope> </dependency> </dependencies> </project>
配置文件中添加了dependencies元素,该元素可以包含多个dependency元素声明项目的依赖,这里添加的一个依赖---groupId是junit,artifactIdea是junit,version是4.7。
groupId,artifactId,version是任何一个Maven项目的基本坐标,Junit也一样,有了这个声明,Maven就能自动的下载junit-4.7.jar。Maven有一个中央仓库http://repo1.maven.org/
下载需要的文件。junit的scope表示依赖范围,如果依赖范围为test表示该依赖只对测试时有效。依赖范围默认是compile。
添加了依赖,然后编写java类,在src/test/java下创建com.lmy.helloworld.HelloWorldTest:
package com.lmy.helloworld; import static org.junit.Assert.assertEquals; import org.junit.Test; public class HelloWorldTest{ @Test public void testSayHello(){ HelloWorld helloWorld = new HelloWorld(); String result = helloWorld.sayHello(); assertEquals("Hello World",result); } }
然后在命令行执行mvn clean test:
测试通过,项目编译运行之后就是打包,在pom没有指定打包类型,默认是jar,执行mvn clean package命令,在打包之前,会执行编译、测试等操作,然后将项目主代码打包到target目录下,文件名默认为artifactId-version.jar规则进行命名,也可以使用finalName自定义名称。
至此,就可以复制这个jar文件到其他项目的classpath中使用HelloWorld这个类,要让其他maven项目可以直接引用这个jar的话,还需要一个步骤,执行mvn clean install。
该操作会执行编译、测试、打包等命令,然后会把该jar文件放到本地仓库里面。这样就可以在其他Maven项目中引用这个jar了。
然后就是运行这个项目,HelloWorld自带了一个main方法。默认打包生成的jar是不能运行的,打开jar文件中的META-MANIFEST.MF文件,找不到Main-Class这一行。为了生成可执行的jar文件,需要借助maven-shade-plugin,配置该插件。
<build> <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>com.lmy.helloworld.HelloWorld</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin> </plugins> </build>
配置了mainClass为com.lmy.helloworld.HelloWorld,项目打包时就会将该信息放到MANIFEST中。执行mvn clean install,构建完成后打开target目录,可以看到
helloworld-1.0-SNAPSHOT.jar和original-helloworld-1.0-SNAPSHOT.jar前者是带有main-class可以运行的,后者是原始的。
执行java -jar helloworld-1.0-SNAPSHOT.jar,输出结果:Hello World