前言

又要开发新项目了,还是创建新项目,怎么办?老大说按照 xxx 项目的结构创建一个新项目就可以了。

公众号:liuzhihangs,记录工作学习中的技术、开发及源码笔记;时不时分享一些生活中的见闻感悟。欢迎大佬来指导!

在工作中经常有新项目需要创建,此时就会有三种常用的方式

CC 大法 新建项目,然后找到之前的各种工具类,复制粘贴进来,此时还不一定能跑起来,然后再进行各种调试。

CD 大法 复制老项目,然后改 module 名字,依赖名字,删除老代码,当然也不一定能跑起来,此时再进行各种调试。

当然,这里肯定不是使用这两种办法,下面咱们介绍一种更简洁的方式,使用 maven archetype 生成项目模版,一键创建项目。

Action!!!

什么是 Archetype ?

简而言之,Archetype 是 Maven 项目模板工具箱。

An archetype is defined as an original pattern or model from which all other things of the same kind are made.

原型被定义为原始样式或模型,从中可以制成所有其他同类项目。

官方解释,简洁明了,就是使用已有的项目,生成一个模版。以后使用这个模版就可以快速生成结构相同的项目了。在团队开发中很有用。

其实就是官方解释,地址贴上来:http://maven.apache.org/archetype/maven-archetype-plugin/index.html

下面使用 IDEA 作为演示工具,一步一步开始介绍。

准备模版项目

这里还是要有一个模版项目,比如这样:

这是一个多 module 项目,一个简单的 demo

  1. 使用了 nacos 作为注册中心;
  2. fegin 作为调用工具;
  3. 有通用校验 token 工具类;
  4. 假设里面也有一些公司的公共配置(MQ,链路监控,统一日志等)。

当然这个项目是可以跑起来的。新创建的项目也是这个模版。

进入主题

使用命令

**archetype:generate **

这样是基于当前项目生成,你也可以使用官网的用法分别指定参数

  1. mvn archetype:generate 然后一步一步按照提示输入;
  2. 一次性输入,其中 DarchetypeGroupId 、DarchetypeArtifactId 、DarchetypeVersion 为生成的 Archetype 项目的组织版本。
mvn archetype:generate                                  \
-DarchetypeGroupId=<archetype-groupId> \
-DarchetypeArtifactId=<archetype-artifactId> \
-DarchetypeVersion=<archetype-version> \
-DgroupId=<my.groupid> \
-DartifactId=<my-artifactId>

高级用法 mvn clean archetype:create-from-project

执行图示如下:

执行后返回 IDEA 查看项目,在 target/generated-sources 目录下的 archetype 即生成的项目模版。

结构如图所示:

  1. main/resources/archetype-resources:项目的模版,生成新项目,就是根据这块的代码进行生成的。

    1. .idea 无用,删除掉。
    2. __rootArtifactId__xxx 项目的各个 module
  2. main/resources/META-INF/maven/archetype-metadata.xml:模版工程的元数据配置。

可以把 archetype 拷出去,这是一个单独的工程模版,拷出去之后,使用 IDEA 打开。

下面开始介绍 archetype 里面都有什么。

archetype 模版项目介绍

使用 IDEA 打开之后发现,还是一个 Maven 项目。

archetype-resources

打开 pom 文件,可以看到里面 ${groupId}${artifactId}${version} 使用占位符指定的组织版本,这些就是新创建项目时指定的。

archetype-metadata.xml

archetype-metadata.xml 里面为元数据配置。

  • fileSet:用来生成一些项目中的文件。如果文件或目录名称包含 __property__ 模式,则将其替换为相应的属性值。
属性 类型 描述
filtered boolean 过滤文集,将指定文件直接复制不需要修改。默认值为:false。
packaged boolean 打包文件,指定文件将在package属性之前的目录结构中生成/复制。它们可以是非打包的,这意味着所选文件将在没有该前缀的情况下生成/复制。默认值为:false。
encoding String 过滤内容时使用的编码。

fileSet 包含以下元素:

元素 类型 描述
directory String 生成项目文件的目录
includes/include* List 包含文件
excludes/exclude* List 排除文件

因为生成项目不需要 .idea *.iml 文件,所以直接删除:

  • module 就是要生成的项目一共几个 module
属性 类型 描述
id String The module's artifactId.
dir String The module's directory.
name String The module's name.
元素 类型 描述
fileSets/fileSet* List 文件
modules/module* List 模块

可以看出里面就是自己的项目模版。

__rootArtifactId__-controller 在生成的时候,就会根据传入的 artifactId 生成指定的 module 名字。

使用

  1. clean install

  1. IDEA Add Archetype

  1. 选择使用 Archetype 生成新项目

  1. 填写新生成项目的名字等

  1. 生成新项目

扩展

Q: 如何自定义包路径?

A: 可以使用 requiredProperties 自定义参数。通过传入自定义的参数,来生成自定的包路径。

比如发现新生成项目的包路径都是 com.liuzhihang.archetype,这样肯定是不行的,每个项目有每个项目自己的包路径。只需要做以下修改:

  1. requiredProperties 添加到项目中,然后添加新变量 middlePackage
<requiredProperties>
<!--使用archetype时候必须要求输入的参数-->
<requiredProperty key="groupId">
<!--可以设置默认值,使用archetype会使用默认值-->
<defaultValue>com.liuzhihang</defaultValue>
</requiredProperty>
<requiredProperty key="package">
<defaultValue>com.liuzhihang</defaultValue>
</requiredProperty>
<requiredProperty key="middlePackage">
<defaultValue>${rootArtifactId}</defaultValue>
</requiredProperty>
</requiredProperties>
  1. 修改模版的文件名

如果文件或目录名称包含 __property__ 模式,则将其替换为相应的属性值。到这里还不行,因为生成的包名还没改。

  1. 修改内部文件的包路径。包括 .java 、** .xml** 、** .properties** 等。

  1. 重新 clean install

注:此时可能会报错,需要在 src/test/resources/projects/basic/archetype.properties 下添加 middlePackage=basic 再重新尝试下。

在生成时注意指定 middlePackage 属性。

Q: 我想自定义 Application 的名字怎么弄?

A: 同样使用 requiredProperties 自定义参数。

<requiredProperty key="appName">
</requiredProperty>

当然也可以起一个通用的名字。

Q: 别的小伙伴怎么用?

A: 当然是 deploy 到私服了, 在 pom 里面添加如下配置,指定自己公司的私服。deploy ,这样就可以和小伙伴一起愉快的使用啦。

<!-- 远程仓库 -->
<distributionManagement>
<repository>
<id>releases</id>
<name>Nexus Release Repository</name>
<url>http://liuzhihang.com:xxxx/repository/maven-releases/</url>
</repository>
<snapshotRepository>
<id>snapshots</id>
<name>Nexus Snapshot Repository</name>
<url>http://liuzhihang.com:xxxx/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>

Q: 我要怎么从 IDEA 删除 Archetype ​?

A: 这么好用怎么舍得删除​呢?只要找到以下路径

liuzhihang % > pwd
/Users/liuzhihang/Library/Caches/JetBrains/IntelliJIdea2020.1/Maven/Indices

里面有一个 UserArchetypes.xml​, 打开,删除掉里面的 archetype 就行。

相关资料

代码:https://github.com/liuzhihang/archetype-demo

老大说新项目的结构和 xxx 项目一样就可以了,我 ……(使用 Maven Archetype 快速创建项目)的更多相关文章

  1. vue-cli3.X快速创建项目

    1.安装 Vue CLI 的包名称由 vue-cli 改成了 @vue/cli. 如果你已经全局安装了旧版本的 vue-cli (1.x 或 2.x),你需要先通过以下方式先卸载它: npm unin ...

  2. SpringBoot——IDEA使用 Spring Initializer快速创建项目【四】

    前言 使用Spring Initializer快速创建项目 步骤 首先肯定是打开我们的IDEA的编辑器呀~ 创建项目 File -> New -> Project Spring Initi ...

  3. maven archetype生成自定义项目原型(模板)

    maven archetype可以将一个项目做成项目原型,之后只需要以此原型来创建项目,那么初始创建的项目便具有原型项目中的一切配置和代码.通俗讲就是一个项目模板. eclipse中那些快速生成mav ...

  4. springBoot(2)---快速创建项目,初解jackson

    快速创建项目,初解jackson 一.快速创建项目 springboot官网提供了工具类自动创建web应用:网址:http://start.spring.io/ 官网页面 1.快速创建一个 选择web ...

  5. 怎么用Vuecli 3.0快速创建项目

    一.安装 1.安装node.js,这里需要注意的是,Vue CLI 3需要 nodeJs ≥ 8.9,所以我们去中文官方下载地址:http://nodejs.cn/download/,下载最新版本即可 ...

  6. vue cli 3.0快速创建项目

    本地安装vue-cli 前置条件 更新npm到最新版本 命令行运行: npm install -g npmnpm就自动为我们更新到最新版本 淘宝npm镜像使用方法 npm config set reg ...

  7. 【HttpRunner v3.x】笔记 ——2. 用脚手架快速创建项目

    环境装好了,相信很多童鞋已经迫不及待的想run起来了,但是面对一个陌生的框架又无从下手.没关系,我们可以用脚手架来快速生成一个httprunner项目. 一.快速生成项目 我们不妨先输入httprun ...

  8. vue-cli3快速创建项目

    文档:https://cli.vuejs.org/zh/guide/ 条件: npm 更至最新 node >=8.9 1.全局安装 npm install -g @vue/cli 或 yarn ...

  9. 使用Maven命令行快速创建项目骨架(archetype)

      > mvn archetype:generate 接下来就会输出一些列带索引变化的archetype项可供我们选择,然后提示我们选择一个编号,可以直接回车选择默认的编号(392),然后就跟着 ...

随机推荐

  1. 使用 .NET 进行游戏开发

    微软是一家综合性的网络公司,相信这点来说不用过多的赘述,没有人不知道微软这个公司,这些年因为游戏市场的回报,微软收购了很多的游戏公司还有独立工作室,MC我的世界就是最成功的的案例,现在市值是排在全世界 ...

  2. JavaScript查找字符串中给定字符出现的位置以及次数

    要求: 给定字符串oabcoefoxyozzopp,要求输出字符o出现的位置和次数. 实现思路: 先查找第一个o出现的位置 然后只要判断indexOf返回的结果,若不是-1,则继续往后查找 因为ind ...

  3. 如何快速构建React组件库

    前言 俗话说:"麻雀虽小,五脏俱全",搭建一个组件库,知之非难,行之不易,涉及到的技术方方面面,犹如海面风平浪静,实则暗礁险滩,处处惊险- 目前团队内已经有较为成熟的 Vue 技术 ...

  4. lua 1.0 源码分析 -- 1 lua 的虚拟指令

    lua的解释器拿到 lua 编写的源码,首先进行解析,就是进行词法分析和语法分析,将源码转换成 lua 的指令集,然后执行这个指令集. lua 源码: function f(val) return v ...

  5. linux块设备驱动---相关结构体(转)

    上回最后面介绍了相关数据结构,下面再详细介绍 块设备对象结构 block_device 内核用结构block_device实例代表一个块设备对象,如:整个硬盘或特定分区.如果该结构代表一个分区,则其成 ...

  6. docker registry 记录

    部署 运行下面命令获取registry镜像 docker pull registry 下载到的版本默认为 docker.io/registry latest 将registry镜像运行并生成一个容器 ...

  7. 快速掌握Java8 Stream函数式编程技巧

    函数式编程优势 "函数第一位",即函数可以出现在任何地方. 可以把函数作为参数传递给另一个函数,还可以将函数作为返回值. 让代码的逻辑更清晰更优雅. 减少了可变量(Immutabl ...

  8. docker启动服务---------------redis

    1. docker拉取镜像 docker pull redis 2 建立配置目录和准备配置文件 mkdir -p /usr/local/docker-redis && cd /usr/ ...

  9. spring boot:用spring security加强spring boot admin的安全(spring boot admin 2.3.0 / spring boot 2.3.3)

    一,spring boot admin的安全环节: 1,修改context-path,默认时首页就是admin, 我们修改这个地址可以更安全 2,配置ip地址白名单,有ip限制才安全, 我们使用了sp ...

  10. linux wget指定下载目录和重命名

    当我们在使用wget命令下载文件时,通常会需要将文件下载到指定的目录,这时就可以使用 -P 参数来指定目录,如果指定的目录不存在,则会自动创建. 示例: p.p1 { margin: 0; font: ...