Maven自定义ArcheType踩过的坑

  刚接手一个Java Web的ssh+shiro的项目,前辈已经将模板工程打包好了,留下了一个Jar包,自己在使用时只需通过Maven命令利用该包从命令行生成模板工程即可,十分方便。但是在安装好的模板工程中存在一个痛点,就是pom文件中有两个依赖包已过时,Maven中央仓库里没有了,每次生成模板后都需要去修改那两个地方,令人不爽,决定自己重新打包,生成自己的模板工程,所以就开始了踩坑之旅。

1.进入误区

  混淆了Maven自定义ArcheType与Maven打包为Jar
  由于Maven自定义ArcheType最终会生成一个Jar包,所以自己一开始就以为是通过直接打包为Jar来生成的,Maven打包为Jar是指生成一个可执行的Jar文件,里面装的是class文件与配置文件,而自定义ArcheType则是生成一套程序模板,里面是源代码和资源文件。这两者一定要分清楚。

2.自定义ArcheType

  接下来参考官方文档自定义ArchType。

(1).创建工程目录结构与pom文件

  自定义ArcheType需要在一个Maven工程中进行,而模板工程则作为该工程资源的一部分,放在资源目录下一个名为archetype-resources的目录中,此外,还需要一个描述模板工程内容的xml文件,放在资源目录下的META-INF/maven目录中,创建如图所示的工程目录结构与pom文件。
这里写图片描述

(2).填写archetype-metadata.xml的内容

  该文件用于描述模板工程内哪些文件是在通过模板生成新工程时所需要的。一开始我按照官方文档去做,如下图所示,但是后来发现通过这种方式在指定有限数量的文件时,一切正常,而我企图使用通配符时,发现可以生成ArcheType,能够安装到本地仓库中去,但是后来使用此ArcheType来生成新的工程时错误就出现了,提示通配符所代表的文件找不到,安装失败。可能是我使用通配符的方式不对,寻正确方式但搜索无果,如果有哪位朋友知道该怎么用请分享给我,非常感谢。
这里写图片描述
后来采用另一位朋友文章中的方法,问题才得以解决,最终代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<archetype-descriptor name="ssh-shiro">
    <fileSets>
        <fileSet filtered="true" encoding="UTF-8">
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.**</include>
            </includes>
        </fileSet>
        <fileSet filtered="true" encoding="UTF-8">
            <directory>src/main/resources</directory>
            <includes>
                <include>**/*.**</include>
            </includes>
        </fileSet>
        <fileSet filtered="true" encoding="UTF-8">
            <directory>src/test/java</directory>
            <includes>
                <include>**/*.**</include>
            </includes>
        </fileSet>
        <fileSet filtered="true" encoding="UTF-8">
            <directory>src/main/webapp</directory>
            <includes>
                <include>**/*.**</include>
            </includes>
        </fileSet>
    </fileSets>
</archetype-descriptor>

(3).修改模板工程中的pom文件

  修改模板工程中的pom文件是为了使得其中的一些属性可配置,你肯定不会希望一个模板里面一点可变的东西都没有,那也太不灵活了。主要修改的地方就是groupId,artifactId,version与packaging,如下图所示。前三项是实现通过模板创建工程时让用户来指定,后一项则是指定工程的类型,也是最关键的地方。
这里写图片描述
  为什么这篇文章题目要突出踩坑呢?主要的坑就在这里,而且是自己挖的。我参照官方文档将packaging改成了jar(原本是war),这就给自己挖下了坑,这个坑最后讲,先把生成模板工程这部分讲完。正确的做法是packaging应指定为模板工程本身的类型,Java工程就指定为jar,而web工程则应指定为war。

(4).安装ArcheType并通过模板工程生成新的工程

  在ArcheType工程(也就是模板工程外面那一层的工程)根目录下运行mvn install,就可以把生成的模板工程安装到本地Maven仓库中,然后再在命令行中通过以下命令使用模板工程创建新工程:

mvn archetype:generate -DarchetypeRepository=D:\.m2\repository -DarchetypeGroupId=wx.archetypes -DarchetypeArtifactId=ssh-shiro -DarchetypeVersion=1.0-SNAPSHOT

  其中-DarchetypeRepository可指定一个无效目录,目的是为了不让Maven在中央仓库搜索,直接搜索本地仓库,也可省略,而后面的几个参数则是ArcheType工程的参数,如第一张图所示,大家根据需要改成自己的就行,需要注意的是版本号一定要写对,否则会出现找不到ArcheType的情况。再接下来根据提示输入新建工程的各个参数,就能通过模板工程创建好一个新的工程了。

3.踩坑经验

  最后来讲一讲2.(3)中踩到的坑。

  在将packaging由war改为jar后,通过模板工程创建新的工程依然可以完成,依然可以将创建的新工程导入到IntelliJ Idea中,导入为Maven项目,但是这时Idea就不认识这个web工程了,把它当做Java工程来对待。是怎么知道这一点的呢?当然是在部署的时候,如下图所示,只能选择外部的资源,而正常的web项目是有一个Archive选项的。
这里写图片描述
  这时我根本没意识到是war到jar这一点惹的祸,觉得导入的项目本来就应该修这补那,可能是我哪里配置不对,结合以前Eclipse的经验,记得有个Facets选项可以指定工程类型,于是在Idea中一搜,果然有,于是赶紧配置一番,如下图所示,注意标注红框的地方需要改为自己工程中web.xml的位置和webroot,同时注意最后的提示,说没有artifact。
这里写图片描述
  于是再去Artifacts选项整一个artifact出来。经一番摸索,得知正确流程,首先添加war exploded,再根据exploded添加war,但是弄好后工程还是不能跑,原因是还需要添加所有依赖包,并将它们放在名为lib的文件夹中,如下图所示。
这里写图片描述
  就这样,一番折腾之后,工程终于能跑了,出现了熟悉的Hello World。
  总结一下,虽然是由于自己大意没理解含义就照搬官方文档导致自己掉进坑里,但是在填坑的过程中,也知道了如何让Idea把一个“它以为不是web工程的工程”当做web工程来对待,并成功跑出结果,收获还是有的。
  虽然踩了坑不太光彩,但是把自己的踩坑经历写出来,希望能够帮助到一些像自己一样的新手吧。

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值