概述
传统工程中,jar包需要自己拷贝到项目里面来,然后项目编译的时候可以访问到这些jar包,完成项目的构建工作。
但是maven项目则不同,实际上项目目录下是没有jar包的。maven工程对项目的结构是有特殊要求的,比如至少得有一个配置文件,告诉工程需要引用那些 jar包。这些jar包会自动从中央仓库下载到本地仓库,并参与项目的构建。
本文通过一个具体的实例了解maven项目结构与传统项目的不同,也了解下maven项目构建方式与传统方式的不同。
新建maven项目
1、File-New-Other-Maven-Maven Project-Next
2、在New Maven Project界面直接Next
3、在Select An Archetype界面,Archetype的意思是原型,所谓原型可以理解为模版,就是有一些结构不用咱们一个个去写,系统自动生成。此处我们选个简单的maven-archetype-quickstart,这个原型会帮我们生成maven工程基本结构,然后Next。
4、输入工程的信息:
Group Id:com.panda
Artifact Id:mvndemo
Version:0.0.1-SNAPSHOT
Package:com.panda.mvndemo
注意Package是输入Group Id和Artifact Id后自动生成的,可以理解Artifact Id是项目名,Group Id是组织机构名,此处组织机构就是个人panda了。
5、点击Finish,注意eclipse右下角有进度条,然后项目中的目录文件一直在增加,这是maven帮我们根据原型自动构建项目的过程。
项目目录结构分析
根据maven-archetype-quickstart模型自动生成的项目目录结构如下:
- mvndemo:项目
- src/main/java:业务代码
- src/test/java:测试代码
- JRE System Library:JRE库,此处引用了JDK1.8
- Maven Dependencies:Maven依赖库,此处引入了由pom.xml指定的junit-3.8.1.jar
- junit-3.8.1.jar
- src:可以从文件结构看到业务代码和测试代码,一般不用打开看。
- target:暂时不用
- pom.xml:定义maven配置信息
都很好理解,唯一需要正视的就是pom.xml,它定义了maven项目的依赖jar包情况,具体分析下:
<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.panda</groupId>
<artifactId>mvndemo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>mvndemo</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<!-- 配置项目依赖的jar包 -->
<dependencies>
<!-- 一个依赖 -->
<dependency>
<!-- 通过groupId、artifactId、version唯一定位一个jar包,所以这是一个坐标 -->
<!-- 该坐标指定的junit-3.8.1.jar被自动放入Maven Dependencies依赖库中,程序构建时可以使用该jar -->
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
maven项目的构建
正常项目导入jar包,编辑完代码,可以进行测试和打包安装了。maven项目需要通过maven来执行这个过程,主要包括:清理、测试、打包。
清理
右键点击项目名称-Run as-Maven clean,执行清理操作,控制台输出关键信息如下:
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ mvndemo ---
[INFO] Deleting D:\Workspace\EclipsePhoton\mvndemo\target
[INFO] Total time: 0.199 s
[INFO] Finished at: 2018-09-07T16:39:35+08:00
可以看出几点:
- eclipse菜单Maven clean点击后实际上应该是调用maven完成的maven-clean清理操作
- 清理操作应该是删除target目录下生成的一些东西
- 在0.199s内完成了清理操作
总结来说,maven项目需要先清理下,否则可能因为之前生成的东西影响新的生成。
测试
右键点击项目名称-Run as-Maven test,执行测试操作,控制台输出关键信息如下:
Running com.panda.mvndemo.AppTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.002 sec
可以看出几点:(如果对单元测试不熟悉的,建议去稍微了解下)
- 执行了AppTest测试类,该类因为继承了TestCase,而TestCase实现了junit框架下的Test接口实现了单元测试功能
- 可以推测出,当执行Maven test测试操作时,maven会自动调用src/test/java下面的测试类的测试方法。因为我们已经在pom.xml配置了junit,所以此处能识别并调用junit单元测试方法。
- 测试方法代码如下,因为
assertTrue( true );
肯定断言成功,所以最后测试结果是run:1个,没有失败和错误。
public void testApp()
{
assertTrue( true );
}
打包安装
右键点击项目名称-Run as-Maven install,执行安装操作,控制台输出关键信息如下:
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ mvndemo ---
[INFO] Building jar: D:\Workspace\EclipsePhoton\mvndemo\target\mvndemo-0.0.1-SNAPSHOT.jar
可以看出,在target目录下生成了一个mvndemo-0.0.1-SNAPSHOT.jar。
运行程序
我们使用命令执行mvndemo-0.0.1-SNAPSHOT.jar
首先在D:\Workspace\EclipsePhoton\mvndemo\target\
目录新建mvndemo.bat脚本,用于在windows平台调用java运行生成的 mvndemo-0.0.1-SNAPSHOT.jar。
mvndemo.bat脚本文件内容如下:
java -jar mvndemo-0.0.1-SNAPSHOT.jar
pause
运行后如下,可见需要配置程序的入口。
D:\Workspace\EclipsePhoton\mvndemo\target>java -jar mvndemo-0.0.1-SNAPSHOT.jar
mvndemo-0.0.1-SNAPSHOT.jar中没有主清单属性
可想而知maven程序的入口必然是在pom.xml中配置,我们在pom.xml中为project根节点增加一个build节点如下:
<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.panda.mvndemo.App</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
所以此时就会调用入口类:com.panda.mvndemo.App,这个是自动生成的,代码如下:
public class App
{
public static void main( String[] args ) throws InterruptedException
{
System.out.println( "Hello World!" );
}
}
OK,重新清理、生成,调用mvndemo.bat后:
D:\Workspace\EclipsePhoton\mvndemo\target>java -jar mvndemo-0.0.1-SNAPSHOT.jar
Hello World!
OK ,大功告成,厉害炸了。
总结与补充
使用maven后,实际上对整个项目的管理,不论是代码结构目录,还是编译生成运行方式,实际上都变了。
但是都是很合理按照需求发生的变化,我们熟悉一下,也就顺理成章的用就行了。
另补充下,其实不用eclipse,直接执行mvn命令也能完成整个项目的构建、生成,就像java程序也可以直接用java命令行生成一样。有兴趣的可以去了解下,有助于加深对maven的理解,当然不去看也OK,反正我也没看。