手记

maven一波流(3)——使用eclipse构建第一个maven工程

概述

传统工程中,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

可以看出几点:

  1. eclipse菜单Maven clean点击后实际上应该是调用maven完成的maven-clean清理操作
  2. 清理操作应该是删除target目录下生成的一些东西
  3. 在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

可以看出几点:(如果对单元测试不熟悉的,建议去稍微了解下)

  1. 执行了AppTest测试类,该类因为继承了TestCase,而TestCase实现了junit框架下的Test接口实现了单元测试功能
  2. 可以推测出,当执行Maven test测试操作时,maven会自动调用src/test/java下面的测试类的测试方法。因为我们已经在pom.xml配置了junit,所以此处能识别并调用junit单元测试方法。
  3. 测试方法代码如下,因为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,反正我也没看。

0人推荐
随时随地看视频
慕课网APP