之前讲述JUnit的POM及jar的下载的时候,我们说只有构件被下载到本地仓库后,才能由所有Maven项目使用,
这里是同样的道理,只有将Hello World的构件安装到本地仓库之后,其他Maven项目才能使用它。
我们已经将体验了Maven最主要的命令:mvn clean compile、mvn clean test、mvn clean package、mvn clean install。
执行test之前是会先执行compile的,执行package之前是会先执行test的,
而类似地,install之前会执行package。我们可以在任何一个Maven项目中执行这些命令,而且我们已经清楚它们是用来做什么的。
到目前为止,我们还没有运行Hello World项目,不要忘了HelloWorld类可是有一个main方法的。
默认打包生成的jar是不能够直接运行的,因为带有main方法的类信息不会添加到manifest中
(我们可以打开jar文件中的META-INF/MANIFEST.MF文件,将无法看到Main-Class一行)。
为了生成可执行的jar文件,我们需要借助maven-shade-plugin,配置该插件如下:
Java代码
plugin元素在POM中的相对位置应该在
我们配置了mainClass为com.juvenxu.mvnbook.helloworld.HelloWorld,项目在打包时会将该信息放到MANIFEST中。
现在执行 mvn clean install ,待构建完成之后打开target/目录,
我们可以看到hello-world-1.0-SNAPSHOT.jar和original-hello-world-1.0-SNAPSHOT.jar,
前者是带有Main-Class信息的可运行jar,后者是原始的jar,
打开hello-world-1.0-SNAPSHOT.jar的META-INF/MANIFEST.MF,可以看到它包含这样一行信息:
Main-Class: com.juvenxu.mvnbook.helloworld.HelloWorld
现在,我们在项目根目录中执行该jar文件:
D: \code\hello-world>java -jar target\hello-world-1.0-SNAPSHOT.jar
Hello Maven
控制台输出为Hello Maven,这正是我们所期望的。
本小节介绍了Hello World项目,侧重点是Maven而非Java代码本身,
介绍了POM、Maven项目结构、以及如何编译、测试、打包,等等。
------------------------------------------------------
3.5 使用Archetype生成项目骨架
Hello World项目中有一些Maven的约定:
在项目的根目录中放置pom.xml,
在src/main/java目录中放置项目的主代码,
在src/test/java中放置项目的测试代码。
我们称这些基本的目录结构和pom.xml文件内容称为项目的骨架,
当你第一次创建项目骨架的时候,你还会饶有兴趣地去体会这些默认约定背后的思想,
第二次,第三次,你也许还会满意自己的熟练程度,但第四、第五次做同样的事情,就会让程序员恼火了,
为此Maven提供了Archetype以帮助我们快速勾勒出项目骨架。
还是以Hello World为例,我们使用maven archetype来创建该项目的骨架,离开当前的Maven项目目录。
如果是Maven 3,简单的运行:
mvn archetype:generate
我们实际上是在运行插件maven-archetype-plugin,
注意冒号的分隔,其格式为 groupId:artifactId:version:goal ,
org.apache.maven.plugins 是maven官方插件的groupId,maven-archetype-plugin
是archetype插件的artifactId,2.0-alpha-5 是目前该插件最新的稳定版,generate是我们要使用的插件目标。
紧接着我们会看到一段长长的输出,有很多可用的archetype供我们选择,
包括著名的Appfuse项目的archetype,JPA项目的archetype等等。
每一个archetype前面都会对应有一个编号,同时命令行会提示一个默认的编号,
其对应的archetype为maven-archetype-quickstart,我们直接回车以选择该archetype,
紧接着Maven会提示我们输入要创建项目的groupId、artifactId、 version、以及包名package,如下输入并确认:
Java代码
Define value for groupId: : com.juvenxu.mvnbook
Define value for artifactId: : hello-world
Define value for version: 1.0-SNAPSHOT: :
Define value for package: com.juvenxu.mvnbook: : com.juvenxu.mvnbook.helloworld
Confirm properties configuration:
groupId: com.juvenxu.mvnbook
artifactId: hello-world
version: 1.0-SNAPSHOT
package: com.juvenxu.mvnbook.helloworld
Y: : Y
Archetype插件将根据我们提供的信息创建项目骨架。
在当前目录下,Archetype插件会创建一个名为hello-world(我们定义的artifactId)的子目录,
从中可以看到项目的基本结构:基本的pom.xml已经被创建,里面包含了必要的信息以及一个junit依赖;
主代码目录src/main/java已经被创建,在该目录下还有一个Java类com.juvenxu.mvnbook.helloworld.App,
注意这里使用到了我们刚才定义的包名,而这个类也仅仅只有一个简单的输出Hello World!的main方法;
测试代码目录src/test/java也被创建好了,并且包含了一个测试用例com.juvenxu.mvnbook.helloworld.AppTest。
Archetype可以帮助我们迅速地构建起项目的骨架,
在前面的例子中,我们完全可以在Archetype生成的骨架的基础上开发Hello World项目以节省我们大量时间。
此外,我们这里仅仅是看到了一个最简单的archetype,
如果你有很多项目拥有类似的自定义项目结构以及配置文件,
你完全可以一劳永逸地开发自己的archetype,然后在这些项目中使用自定义的archetype来快速生成项目骨架