Maven 构建 java 项目(一)

大家可能经常使用 eclipse 写 java 项目,那么怎么检验项目在脱离 eclipse 环境时依旧能成功运行呢?今天我想要介绍的就是使用 Maven 构建项目,将一步一步的带领大家进行 java 项目的构建。

概要

本文为系列文章第一篇,主要介绍了 Maven 的安装配置,命令的简单使用,pom.xml 的简单理解,jar包的运行,以及为 jar 包指定主类的问题,都是基础方面的使用。

安装配置

下载

Maven官方下载地址

我是Win10系统,下载了 apache-maven-3.5.3-bin.zip,解压会得到 apache-maven-3.5.3 文件夹。

配置

我将其移动到了 C:\Program Files\ 下,接着需配置环境变量 。

添加位置: 控制面板->系统和安全->系统->高级系统设置->环境变量->系统变量->Path,在其中添加一项 C:\Program Files\apache-maven-3.5.3\bin,保存设置。

检验

在命令行中输入 mvn --version,会看到打印的版本信息。

初始构建

可参考: Maven Documentation -> Maven in 5 Minutes

常用命令

mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
//快速构建maven项目,分别指定了groupId, artifactId, 构建类型, 并关闭交互模式。
//简化起见,后四个参数可省略,构建时会采用交互模式,提示用户输入相关信息。
mvn compile    //项目编译
mvn test    //进行测试文件的测试
mvn package    //打包,生成可运行jar包,其会同时执行 compile 与 test 命令。
mvn clean     //打包后会生成 target 文件夹,该命令删除 target 文件夹。

初始项目

选择一个位置,在命令行中执行命令 mvn archetype:generate,比如我选择在桌面。执行过程中,前两次暂停可直接回车跳过,第三次即开始提示输入 groupIdartifactId等,我的输入如下,后面的则直接回车跳过即可。

Define value for property 'groupId': com.mycompany.app
Define value for property 'artifactId': my-app
Define value for property 'version' 1.0-SNAPSHOT: :
Define value for property 'package' com.mycompany.app: :

提示完成之后,会在桌面生成 my-app 文件夹,其采用默认的项目目录结构,如下:

my-app
|-- pom.xml
`-- src
    |-- main
    |   `-- java
    |       `-- com
    |           `-- mycompany
    |               `-- app
    |                   `-- App.java
    `-- test
        `-- java
            `-- com
                `-- mycompany
                    `-- app
                        `-- AppTest.java

pom.xml 即为配置文件,想对build进行设置,即需更改此文件。其所在的目录称为根目录。你可以在根目录下尝试 mvn compilemvn testmvn packagemvn clean等操作,看看对新生成的 target 目录分别有什么影响。

pom 文件

生成的pom文件主要如下,可能会有所差别,但是标签大致都差不多,需要注意的是标签的结构,哪个在哪个里边,以后修改的时候要找对位置。
可参考文档:
Maven doc:Introduction to the POM
Maven doc:Getting Started Guide

<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.mycompany.app</groupId>
  <artifactId>my-app</artifactId>
  <version>1.0-SNAPSHOT</version>

  <name>my-app</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <plugin>
              ...
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

jar 包运行

在成功执行打包操作之后,你会发现 target 目录下生成了可执行的 jar 包,那么怎么运行呢?

  • 不含主类的 jar 包运行

    目前项目即为这种情况,并没指定 jar 包的主类,就是第一个要执行的类。此时需将 jar 包作为环境依赖,先 cd 进入 target 目录,执行命令如下:

    java -cp my-app-1.0-SNAPSHOT.jar com.mycompany.app.App
    

    控制台会打印 Hello World!,即意味着你的 jar 包生成成功,本次项目构建成功。

    注意:最后一个参数即为你要执行的类以及路径,不能使用类名的全称 App.java

  • 含主类的 jar 包运行

    直接执行 jar 包即可,我们在后面会介绍如何设置主类。

    java -jar my-app-1.0-SNAPSHOT.jar 
    

添加主类

如何为 jar 文件设置主类呢?在 pom.xml 相应标签下进行如下配置:

<!-- add mainClass -->
<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-jar-plugin</artifactId>
      <configuration>
        <archive>
          <manifest>
            <addClasspath>true</addClasspath>
            <mainClass>com.mycompany.app.App</mainClass>  <!-- App.java 即为主类名-->
          </manifest>
        </archive> 
      </configuration>
    </plugin>
  </plugins>
</build>

成功生成 jar 包之后,照上边介绍的运行即可看到输出 Hello World!

java -jar my-app-1.0-SNAPSHOT.jar 

总结

本文主要介绍了如何使用 maven 进行简单的项目构建,较为基础,也往往不能满足项目的基本需求。下一篇就将要针对常见的问题进行解决,比如尝试解决了项目目录不是 Maven 默认目录的问题 ,编码不可映射问题,以及使用外部 jar 的问题。

请我吃根棒棒糖吧