1、编写POM

Maven项目的核心是pom.xml,POM(Project Object Model,项目对象模型)定义了项目的基本信息,用于描述项目如何构建,声明项目依赖,等等,现在为feishu项目编写一个最简单的pom.xml。

首先创建一个名为feishu的文件夹,打开该文件夹,新建一个名为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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.up366.feishu</groupId>
    <artfactId>feishu_v3</artfactId>
    <version>1.0-SNAPSHOT</version>
    <name>feishuProject</name>
</project>

第一行指定了该xml的版本及编码方式,紧接着是project元素,这是所有pom.xml的根元素,它还声明了一些POM相关的命名空间及xsd元素,虽然这些元素不是必须的,但是使用这些属性能够让IDE帮助我们快速的编辑POM

  • modelVersion:指定了POM模型的版本,对于Maven2及Maven3来说,它只能是4.0.0
  • groupId:定义了项目属于哪个组,这个组往往和项目所在的组织或公司存在关联,例如com.up366.feishu指明了up366公司的飞书项目。
  • artifactId:定义了当前Maven项目在组中唯一的ID,我们为这个feishu项目定义artifactId为feishu_v3。
  • version:version指定了feishu项目的版本。SNAPSHOT意为快照,说明该项目还处在开发中,还是不稳定版本。随着项目的发展,version会不断的更新,如升级为1.0、1.1-SNAPSHOT、1.1、2.2
  • name:name元素声明了一个对于用户更为友好的项目名称,虽然这不是必须的,但是还是推荐为每个POM声明name,以方便信息交流。

2、编写主代码

默认情况下,Maven假设项目主代码位于src/main/java目录。

关于Java代码有两点需要注意:在绝大多数情况下,应该把项目主代码放到src/main/java目录下(遵守Maven的约定),而无需额外的配置,Maven会自动搜索该目录找到项目主代码。其次,编写的项目的包名的形式为:com.up366.feishu.feishu_v3.。。。
代码编写完毕后,使用Maven进行编译,在项目根目录下运行命令 mvn clean compile

clean告诉Maven清理输出目录taget/,compile告诉Maven编译项目主代码,clean会删除taget/目录。默认情况下,Maven构建的所有输出都在target/目录中。compile命令会将主代码编译至target/classes目录

3、编写测试代码

相对的,Maven中默认的测试代码目录是src/test/java。因此,在编写测试代码之前,应当先创建该目录。

编写测试代码一般会用到Junit,要使用JUnit,首先需要为Hellow World项目创建一个Junit依赖,如下:

<?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.
    up366.feishu</groupId>
    <artfactId>feishu_v3</artfactId>
    <version>1.0-SNAPSHOT</version>
    <name>feishuProject</name>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifact>junit</artifact>
            <version>4.7</version>
            <scope>test</scope>
        </dependency>
    </dependencies
</project>

groupId、artifactId和version是任何一个Maven项目最基本坐标,上面中POM代码中还有一个值为test的元素scope,scope为依赖范围,若依赖范围为test则表示该依赖只对测试有效。换句话说,就是,测试代码中的import JUnit是没有问题的,但是在主代码中import JUnit就会造成编译错误。如果不声明依赖,那么默认值就是compile,表示该依赖对主代码和测试代码都有效。

由于JUnit会用到@Test这个注解,所以会报错,Maven的核心插件之一——compiler插件默认只支持编译Java 1.3,而Java在1.5之后才支持注解的,因此需要配置该插件使其支持Java5,如下:

<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.up366.feishu</groupId>
    <artfactId>feishu_v3</artfactId>
    <version>1.0-SNAPSHOT</version>
    <name>feishuProject</name>
    <build> 
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artfactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.5</source>
                    <target>1.5</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

测试代码经过编译之后在target/test-classes下生成二进制文件。

4、打包和运行

将项目进行编译、测试之后,下一个重要的步骤就是打包(package)了,如果POM中没有指定打包类型,那么使用默认打包类型jar。简单的执行mvn clean package进行打包。

Maven会在打包之前进行编译、测试等操作。打包后的文件是按artifact-version.jar规则进行命名的。

上面已经用到了一些Maven核心的命令:mvn clean compile、mvn clean test、mvn clean test、mvn clean package、mvn clean install。执行test之前是会先去执行compile的,执行package之前会先去执行test、执行install之前,会先去执行package。

带有main方法的类在打包完成后,main方法的信息不会添加到manifest中(打开jar文件中共的META-INF/MANIFEST.MF文件,将无法看到Main-Class一行)。为了生成可执行的jar文件,需要借助maven-shade-plugin,配置该插件如下:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>1.2.1</version>
    <excutions>
        <excution>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>
            <configuration>
                <transformers>
                    <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                        <mainClass>com.up366.feishu.feishu_v3.MainClass</mainClass>
                     </transformer>
                </transformers>
            </configuration>
        </excution>
    </excutions>
</plugin>

plugin元素在POM中的相对位置应该在

4、后续补充使用achetype生成项目骨架