Maven如何自定义脚手架
引言
在项目越来越多的背景下要保证开发效率保证系统稳定,项目标准化将不可避免,其中最开始的就是要有一个或多个骨架工程。 使用这些骨架工程开发实现统一的设计理念,技术栈,功能组件,架构风格,开发规范等一致的约束。
Maven的脚手架是什么
在idea的创建项目中这些选择就是离我们最近的maven脚手架。
脚手架的工程目录结构与常见maven开发工程差异体具体如下(红色代表定死的,蓝色代表可更改的)
最外层的archetype文件夹下的pom.xml文件
<build>
<extensions>
<extension>
<groupId>org.apache.maven.archetype</groupId>
<artifactId>archetype-packaging</artifactId>
<version>2.2</version>
</extension>
</extensions>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-archetype-plugin</artifactId>
<version>2.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>
通过上面图二生成的工程目录
如何自定义一个脚手架工程
工程创建
- 除了根据前面目录结构手动组装一个脚手架的maven
- 我更推荐先准备一个标准的maven工程,再在根目录执行 mvn archetype:create-from-project 命令即可根据这个工程生成它的脚手架原型,路径是执行命令的目录下 target/generated-sources/archetype目录。这个目录就是脚手架的maven工程,然后再根据情况调整。
工程编辑
首先对 META-INF/maven/archetype-metadata.xml 的主要参数解释
<!-- 参数 -->
<requiredProperties>
<requiredProperty key="appName">
<defaultValue>defaultapp</defaultValue>
</requiredProperty>
<requiredProperty key="projectName">
<defaultValue>${appName}</defaultValue>
</requiredProperty>
<requiredProperty key="groupId">
<defaultValue>cn.tanzhou.${appName}</defaultValue>
</requiredProperty>
</requiredProperties>
<!-- fileSets是脚手架创建工程时会生成 archetype-resources 目录下的哪些文件 -->
<fileSets>
<!-- filtered是要创建的文件中的占位符变量需要替换 encoding是文件的编码格式 packaged设置false可以防止 directory 属性内的文件路径下创建__packageInPathFormat文件夹-->
<fileSet filtered="true" encoding="UTF-8" packaged="false">
<!-- 相对路径 按照上面图片这个路径指的是archetype-resources 目录下 -->
<directory></directory>
<!-- 要生成的文件 -->
<includes>
<include>pom.xml</include>
</includes>
</fileSet>
</fileSets>
<!-- module是指子工程 id是工程的artifactId在多层嵌套下用.表示层级 dir是目录在多层嵌套下用/表示层级,name是子工程的的名称在多层嵌套下用.表示层级-->
<module id="origin-web" dir="web" name="origin-web">
<fileSets>
<fileSet filtered="true" packaged="true" encoding="UTF-8">
<!-- 相对路径 按照上面图片这个路径指的是archetype-resources/web/src/main/java 目录下 -->
<directory>src/main/java</directory>
<includes>
<include>**/*.java</include>
<include>**/**</include>
</includes>
</fileSet>
</fileSets>
</module>
关于参数的占位符使用
- 在xml文件内关于参数使用通过${参数变量}, 也可以用__参数变量__方式
- 文件夹上使用参数的方式是__参数变量__方式
- 在 java 文件内使用参数的方式是${参数变量}
工程使用
首先将调整好的 maven 脚手架工程执行 mvn install 打包构建到本地仓库,或者执行 mvn deploy 打包构建到远程私有库上 (本章没讲 deploy 上传配置)
第一种使用方式:idea可以导入自定义脚手架 仅需要填写 GroupId(在maven仓库内的包路径),ArtifactId(在包路径目录下的文件名),Version(版本号),通过以上参数就可以定位准确了。Repository是指第三方maven仓库,比如私有库地址。但这样支持自定义其它参数的脚手架将难以使用。
第二种:通过maven命令创建项目。相比idea更加灵活一些
mvn archetype:generate //表示要创建一个maven工程
-DinteractiveMode=false //表示不是交互模式,不用选择
-DarchetypeCatalog=internal //联网模式 还有local表示使用本地仓库
-DarchetypeRepository=http://xxx/maven-public/ //设置源
-DarchetypeGroupId=cn.com.cs //模板所在的组
-DarchetypeArtifactId=service-template //模板的id
-DarchetypeVersion=1.2.0-SNAPSHOT //版本
-DgroupId =com.cn //项目造出来后java文件夹下的路径组(这个项目打包后这就是maven仓库的文件路径)
-DartifactId=xirizhi-web //项目的名字id(这个项目打包后就是 GroupId 路径下的文件名字)
-DappName=xxx //自定义的appName的参数
...
Maven上传包到私库
maven 的setting.xml 文件内配置
<servers>
<server>
<id>snapshots</id>
<username>admin</username>
<password>123456</password>
</server>
<server>
<id>releases</id>
<username>admin</username>
<password>123456</password>
</server>
</servers>
<profiles>
<profile>
<!-- 为这个私库配置定义一个id -->
<id>new</id>
<repositories>
<repository>
<!-- 这个id对应上面的账号id -->
<id>release</id>
<!-- 私库路径 -->
<url>http://xxx:8888/repository/tzedu-cs-arch-release/</url>
<!-- 是否可推送正式包 -->
<releases>
<enabled>true</enabled>
</releases>
<!-- 是否可推送快照包(固定的.SNAPSHOT文件名结尾的.jar) -->
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<repository>
<id>snapshot</id>
<url>http://xxx:8888/repository/tzedu-cs-arch-snapshot/</url>
<releases>
<enabled>false</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
</profile>
</profiles>
<!-- 默认使用哪个配置 -->
<activeProfiles>
<activeProfile>new</activeProfile>
</activeProfiles>
在项目pom文件内配置(不知道在 maven 工程配置内账号密码怎么搞)
<distributionManagement>
<!-- 配置正式包私库源 -->
<repository>
<!-- id对应maven仓库setting文件内配置的账号server的id -->
<id>releases</id>
<url>http://xxx:8888/repository/tzedu-cs-arch-release/</url>
</repository>
<!-- 配置快照包私库源 -->
<snapshotRepository>
<!-- id对应maven仓库setting文件内配置的账号server的id -->
<id>snapshots</id>
<url>http://xxx:8888/repository/tzedu-cs-arch-snapshot/</url>
</snapshotRepository>
</distributionManagement>
题外:多模块构建时,可在不需要上传私库的模块下 pom 文件内配置一下
<properties>
<maven.deploy.skip>true</maven.deploy.skip>
</properties>
Maven自定义脚手架推荐其它教程
多看几篇你就懂了
总结
maven的自定义脚手架其实也不难嘛~(来自懂王的蜜汁自信)