maven脚手架是相同的目录结构或项目依赖在多个项目之间复制粘贴的重复动作的克星。
内置脚手架
mvn archetype:generate
使用上述命令可以查看当前支持的脚手架
web脚手架
使用web项目脚手架,可以生成一个标准的java-web项目
mvn archetype:generate -DarchetypeArtifactId=maven-archetype-webapp
-D的archetypeArtifactId可以指定你是要使用哪个脚手架
接下来会在命令行中依次询问你项目的信息,group,artifactId,version,packaging等等。
生成的是一个标准的java-web项目的目录结构
父子模块项目
在大型的项目中,我们一般会采用父子模块的方式对项目进行拆分,划分成不同的子模块便于更新升级。
通常是是一个主项目,依赖其他的子包:
1. 在根目录下生成父pom
mvn archetype:generate -DgroupId=com.apress.gswmbook -DartifactId=gswm-parent -Dversion=1.0.0-SNAPSHOT -DarchetypeGroupId=org.codehaus.mojo.archetypes -DarchetypeArtifactId=pom-root
这里使用的脚手架是pom-root
这样生成的父pom,packaging方式是pom
2. 生成子模块
在父模块的根目录下,执行
mvn archetype:generate -DgroupId=com.apress.gswmbook -DartifactId=gswm-web -Dversion=1.0.0-SNAPSHOT -Dpackage=war -DarchetypeArtifactId=maven-archetype-webapp
这里生成了一个java-web项目
接下来生成一个service模块
mvn archetype:generate -DgroupId=com.apress.gswmbook -DartifactId=gswm-service -Dversion=1.0.0-SNAPSHOT -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
这里没有指定packaging,默认是jar
在生成一个仓储模块
mvn archetype:generate -DgroupId=com.apress.gswmbook -DartifactId=gswm-repository -Dversion=1.0.0-SNAPSHOT -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
这样,生成的三个子模块在父pom中就自动进行了声明:
说明他们存在父子关系。
同样的,子模块也自动添加了parent标签,用于声明父模块信息
现在,执行打包命令即可完成项目的打包
创建自定义脚手架
我们基于刚刚web项目创建一个脚手架。
1. 首先将gswm-web项目的代码复制到新建的gswm-web-prototype目录,移除冗余的文件(target等)。修改web.xml为通用的模板
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="4.0" xmlns="http://xmlns.jcp.org/xml/ns/ javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd">
<display-name>Archetype Created Web Application</display-name>
</web-app>
2. 更新pom文件,添加必要的依赖
<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.apress.gswmbook</groupId>
<artifactId>gswm-web</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>gswm-web Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<finalName>gswm-web</finalName>
<plugins>
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.4.12.RC2</version>
</plugin>
</plugins>
</build>
</project>
这里添加了javax.servlet.api依赖
3. 新增必要的文件目录,如src/main/java src/test/java src/test/resources
4. 创建一个健康检查类 AppStatusServlet.java
package com.apress.gswmbook.web.servlet;
import javax.servlet.annotation.WebServlet;
import javax.servlet.∗;
import javax.servlet.http.∗;
import java.io.∗;
@WebServlet("/status")
public class AppStatusServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
PrintWriter writer = response.getWriter();
writer.println("OK");
response.setStatus(response.SC_OK);
}
}
截至目前,这个项目结构如下
5. 创建脚手架
mvn archetype:create-from-project
执行上述语句会在gswm-web-prototype/target/generated-sources/archetype目录下生成脚手架。
6. 将产出的文件复制到新的目录gswm-web-archetype做微调
将生成的pom、src、以及相关的文件复制到新目录
因为现在项目的相关信息都是写死的,我们需要调整一下让项目生成时自动获取项目的名称、包路径等信息,然后替换。
7. 修改脚手架项目的artifactId
根目录下的pom文件中的artifactId改为gswm-web-archetype
8. 模版pom中的artifactId修改为${artifactId}
这样模板生成的时候会自动替换
9. 修改模版类的目录
archetype-resources中的类会平迁到新的项目,因此可以控制类的包路径。
10. 发布脚手架
mvn clean install
使用脚手架
使用本地脚手架,采用下面的命令,从罗列的脚手架中选择即可使用
mvn archetype:generate -DarchetypeCatalog=local