项目Module之间有依赖关系时会导致打jar包失败。
比如,athena-eureka、athena-keystone等模块会在pom中依赖athena-common
<dependency>
<artifactId>athena-common</artifactId>
<groupId>com.xxx.xxx</groupId>
<version>1.0.0<version>
<dependency>
那么,当我打包athena-keystone模块时,会报错,说没能在maven仓库中找到这个依赖。
我的解决办法是:
1、使用maven-assembly-plugin插件进行打包,打包所有pom依赖,并将这些依赖的Jar包解压为class文件。
<plugin>
<artifactId> maven-assembly-plugin </artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
使用 mvn clean package -DskipTests 命令进行打包操作,忽略测试代码
注意,其实原本maven-assembly-plugin插件的打包命令为mvn compile assembly:single,这里可以用mvn package打包是因为我们将插件的goal绑定到了特定的phase上。
phase和goal可以这样理解:maven命令格式是mvn phase:goal,在本例中single为goal,将goal绑定到package这个phase上,所以用户只须执行maven package即可。
2、将本地jar包添加到本地仓库
mvn install:install-file -Dfile=athena-common-1.0.0.jar -DgroupId=com.xxx.xxx
-DartifactId=athena-common -Dversion=1.0.0 -Dpackaging=jar
其中:-DgroupId和-DartifactId的作用是指定了这个jar包在repository的安装路径,只是用来告诉项目去这个路径下寻找这个名称的jar包。
这样的话,依赖该模块的模块进行打包时就可以在本地仓库中找到这个jar包。
后记:在最外层的pom中加入以下编译插件即可在一键执行所有模块的打包插件,不需要手动把被依赖模块的jar包放到本地仓库中:
<!--
指定maven插件编译版本
1:maven:since2.0, 默认用jdk1.3来编译,maven 3.x
貌似是默认用jdk 1.5。 2:windows默认使用GBK编码,java项目经常编码为utf8,
也需要在compiler插件中指出,否则中文乱码可能会出现编译错误。
-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF8</encoding>
</configuration>
</plugin>