maven学习笔记

来源:互联网 发布:cnc加工中心编程详解 编辑:程序博客网 时间:2024/05/16 08:48

<?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/maven-v4_0_0.xsd">

<modelVersion>4.0.0</modelVersion>

<groupId>com.juvenxu.mvnbook</groupId>

<artifactId>hello-world</artifactId>

<version>1.0-SNAPSHOT</version>

<name>Maven Hello World Project</name>

</project>

xml:指定xml文档的版式和编码方式

project:根元素,声明了一些POM相关的命名空间及xsd元素

modelVersion:指定了当前POM模型的版本,对于maven2,maven3来说,只能是4.0.0

最重要的是groupId,artifactId,version

groupId:定义了项目属于哪个组,这个组往往和项目所在的组织或公司存在关联,譬如,在googlecode上建立了一个名为myapp的项目,那么groupId就应该是com.googlecode.myapp

artifactId:定义了当前maven项目在组中唯一的ID

version:指定了项目当前的版本,SNAPSHOT意为快照,说明该项目还处在开发中,是不稳定的版本。

name:声明了一个对于用户更为友好的项目名称,虽然不是必须的,但还是推荐为每个POM声明name,以方便信息交流。

没有任何实际的java代码,就能定义一个maven项目的POM,它能让项目对象模型最大程度地与实际代码相独立,可以称之为解耦。

新建java代码

package com.juvenxu.mvnbook.helloworld;

public class HelloWorld {

   public String sayHello() {

           return "Hello Maven";

   }

   public static void main(String[] args) {

          System.out.print( new HelloWorld().sayHello() );

   }

}

默认情况下,我们须把java代码放在src/main/java/目录下(遵循maven的约定),无须额外的配置,maven会自动搜寻该目录找到项目主代码。

java类的包名是:com.juvenxu.mvnbook.helloworld,这与之前在POM中定义的groupId和artifactId相吻合。

编译:mvn clean compile

clean告诉maven清理输出目录target/,compile告诉maven编译项目主代码,默认情况下maven构建的所有输出都在target/目录中。

编写测试代码:

默认的测试代码目录是:src/test/java

<?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/maven-v4_0_0.xsd">

<modelVersion>4.0.0</modelVersion>

<groupId>com.juvenxu.mvnbook</groupId>

<artifactId>hello-world</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,artifactId,version和前面的意思一样,scope的值为test,表示该依赖只对测试有效,换句话说,测试代码中的import JUnit代码是没有问题的,但主代码中用import JUnit代码,就会造成编译错误。如果不声明依赖范围,表示对主代码和测试代码都有效。

代码:

package com.juvenxu.mvnbook.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 Maven", result);
}
}

mvn clean test

打包和运行:

POM中没有指定打包类型,使用默认打包类型jar,可以简单地执行mvn clean package进行打包,如果有需要,就可以复制这个jar文件到其他项目的Classpath中使用了。

可以使用finalName来自定义该文件的名称。

如何才能让其他的maven项目直接引用这个jar呢?需要一个安装步骤,执行mvn clean install

在打包之后,执行了安装任务install:install,从输出看到该任务将项目输出的jar安装到了maven本地库中(Installing /home/yao/code/mavendir/hello-world/pom.xml to /home/yao/.m2/repository/com/juvenxu/mvnbook/hello-world/1.0-SNAPSHOT/hello-world-1.0-SNAPSHOT.pom)。之前JUnit的POM及jar的下载的时候,我们说只有构建被下载到本地仓库后,才能由所有maven项目使用,这里同样的道理,只有将Hello World的构建安装到本地仓库之后,其他maven项目才能使用它。

虽然HelloWorld类有一个main方法,但是默认打包生成的jar是不能直接运行的,因为带有main方法的类信息不会添加到manifest中。为了生成可执行的jar文件,需要借助maven-shade-plugin,配置该插件如下:

<?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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.juvenxu.mvnbook</groupId>
<artifactId>hello-world</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>
<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.juvenxu.mvnbook.helloworld.HelloWorld</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

现在执行mvn clean install之后,可以看到MANIFEST.MF中包含这样一行信息:Main-Class:com.juvenxu.mvnbook.helloworld.HelloWorld,现在就可以在项目根目录下执行该jar文件:java -jar target/hello-world-1.0-SNAPSHOT.jar,就可以看到输出结果:Hello Maven

原创粉丝点击