maven骨架说白了就是一个模板,一个项目组基本开发风格都是确定的,完全可以使用模板替代,骨架和模板唯一不同之处是,骨架创建的项目可以自动替换一堆和项目名相关的东西,包括模块目录之类的。
1.创建一个普通的多模块项目
不管使用什么方式创建一个多模块的项目是第一步,但是这个多模块项目需要注意的是,如果想要模块目录名和项目名存在联动关系,这个时候就要确定了,比如项目名加dome,模块1名称叫dome1,模块2名称叫dome2,这样使用骨架生成项目时dome可以随着项目名称自动被替换。
项目里需要带上你作为模块必要的一些东西,比如基础配置文件,基础启动类之类的。
在项目的pom文件中添加如下编译插件
<build>
<extensions>
<extension>
<groupId>org.apache.maven.archetype</groupId>
<artifactId>archetype-packaging</artifactId>
<version>3.2.0</version>
</extension>
</extensions>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-archetype-plugin</artifactId>
<version>3.2.0</version>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
<configuration>
<addDefaultExcludes>false</addDefaultExcludes> <!-- 解决复制.gitignore的问题 -->
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-archetype-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<propertyFile>archetype.properties</propertyFile> <!-- 解决排除.idea目录的问题 -->
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
<skip>true</skip>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.5</version>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
在项目下添加archetype.properties文件内容如下,这些东西都可以自定义的
## generate for archetype-metadata.xml
excludePatterns=archetype.properties,*.iml,.idea/,.idea/libraries,logs/,build.sh
## generate gitignore file
gitignore=.gitignore
执行命令mvn archetype:create-from-project
2找到骨架的源文件并进行细微调整
找到项目的target\generated-sources目录下有一个archetype文件,这个就是骨架文件,使用开发工具打开这个项目,最外层的pom文件可以进行正常调整比如骨架名称版本之类的。
需要注意的是主要内容都在src/main/resources下在META-INF/maven目录下有archetype-metadata.xml文件,这个文件是基础配置,可以有标签进行默认属性配置,
标签进行文件设置,这个标签上可以加filtered="true"属性,加了这个属性的会进行属性替换,下面说到的文件上的属性替换前提都是加了这个标签属性的,下面的是我的配置
<requiredProperties>
<requiredProperty key="classNameSuffix">
<defaultValue>Fuck</defaultValue>
</requiredProperty>
<requiredProperty key="gitignore">
<defaultValue>.gitignore</defaultValue>
</requiredProperty>
<requiredProperty key="groupId">
<defaultValue>com.hornsun</defaultValue>
</requiredProperty>
<requiredProperty key="artifactId">
<defaultValue>base</defaultValue>
</requiredProperty>
<requiredProperty key="version">
<defaultValue>1.0.0</defaultValue>
</requiredProperty>
<requiredProperty key="package">
<defaultValue>com.hornsun</defaultValue>
</requiredProperty>
</requiredProperties>
<fileSets>
<fileSet encoding="UTF-8">
<directory/>
<includes>
<include>CHANGELOG.MD</include>
<include>gitignore</include>
<include>使用说明.MD</include>
</includes>
</fileSet>
</fileSets>
<modules>
<module id="${rootArtifactId}_service" dir="__rootArtifactId___service" name="${rootArtifactId}_service">
<fileSets>
<fileSet filtered="true" packaged="true" encoding="UTF-8">
<directory>src/main/java</directory>
<includes>
<include>**/*.java</include>
</includes>
</fileSet>
<fileSet filtered="true" packaged="true" encoding="UTF-8">
<directory>src/test/java</directory>
<includes>
<include>**/*.java</include>
</includes>
</fileSet>
</fileSets>
</module>
<module id="${rootArtifactId}_impl" dir="__rootArtifactId___impl" name="${rootArtifactId}_impl">
<fileSets>
<fileSet filtered="true" packaged="true" encoding="UTF-8">
<directory>src/main/java</directory>
<includes>
<include>**/*.java</include>
</includes>
</fileSet>
<fileSet filtered="true" encoding="UTF-8">
<directory>src/main/resources</directory>
<includes>
<include>**/*.xml</include>
</includes>
</fileSet>
<fileSet filtered="true" encoding="UTF-8">
<directory>src/main/resources</directory>
<includes>
<include>**/*.yml</include>
<include>**/*.sql</include>
</includes>
</fileSet>
<fileSet filtered="true" packaged="true" encoding="UTF-8">
<directory>src/test/java</directory>
<includes>
<include>**/*.java</include>
</includes>
</fileSet>
</fileSets>
</module>
</modules>
我加了自定义属性classNameSuffix,一般我进行install的时候会报错,这是因为默认跑了测试,我们可以把test目录下的archetype.properties文件修改下如我的
#Sat Mar 13 15:36:00 CST 2021
package=it.pkg
version=0.1-SNAPSHOT
groupId=archetype.it
gitignore=.gitignore
artifactId=basic
classNameSuffix=basic
## generate for archetype-metadata.xml
excludePatterns=archetype.properties,*.iml,.idea/,.idea/libraries,logs/,build.sh
## generate gitignore file
gitignore=.gitignore
3使用Velocity进行特殊定制
在标签覆盖范围内的文件上可以使用脚本语言进行特殊开发
使用如下的代码
#set( $systemName = ${rootArtifactId} )
#if(${rootArtifactId.indexOf("-")}!=-1)
#set( $cc = ${rootArtifactId.split("-")})
#if($cc != $null && ${cc.size()} > 0)
#set( $lastIndex = $cc.size() - 1 )
#set( $systemName = $cc[$lastIndex] )
#end
#end
@ConfigurationProperties("${systemName}")
@Data
public class CommonProperties {
所有的文件可以使用上面的形式进行自定义。
当一切修改后,使用mvn install,这样就能生成骨架jar包,可以把这个jar上传到自己的maven仓库也可以在本地使用使用mvn archetype:crawl进行本地使用,
4使用刚刚创建的骨架
可以使用idea添加刚刚的骨架也可以使用命令行直接创建项目
使用命令行的话可以运行下面的命令mvn archetype:generate -Drepository=local
按照提示选择自己骨架的序号,一步一步创建就好。