今天试着将一个maven项目打成jar包供其他项目使用,虽然看起开,对于第一次弄得我还是费了不少功夫,在此记录一下,方便日后查看也给和我一样在此处刨坑的小伙伴们指点迷津。
先讲一下此次打jar包的基本情况:
IDE:idea,maven,这里和jdk版本无关就不做介绍了。
目的:一个maven项目(依赖了第三方jar包)在idea中使用maven打成jar包,然后放在其他项目中使用
首先呢要保证打包项目正常可用以及maven和第三方依赖包以及maven插件没有报错也就是红色波浪线,有则在有网环境中下载依赖即可。
如果打包项目中有test又想跳过test打包则点击上图蓝色闪电按钮 即可
打包方式这里有两种:1、将第三方依赖包打成class类放置到jar包。2、将第三方依赖包打成jar包另外放置。
1、在pom.xml中加入如下代码:下面代码是<!-- 将依赖的jar包中的class文件打进生成的jar包-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.4</version>
<configuration>
<appendAssemblyId>false</appendAssemblyId>
<finalName>searchIndex</finalName>
<descriptorRefs>
<!-- 将依赖的jar包中的class文件打进生成的jar包-->
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<!-- 有Main函数的类:为了生成的jar包使用命令执行时的入口函数,可灵活增加活删除-->
<mainClass>com.yourcompany.yourproject.MainClass</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<!-- <goal>single</goal>-->
<goal>assembly</goal>
</goals>
</execution>
</executions>
</plugin>
2、将第三方依赖包打成jar包另外放置。
<!-- 打包jar文件时,配置manifest文件,加入lib包的jar依赖 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>com.xxx.uploadFile</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<!-- 拷贝依赖的jar包到lib目录 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>
${project.build.directory}/lib
</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
如果想要部分第三方依赖包打进jar包,其余不想打进去则可以在pom.xml中使用<scope>test</scope>,该标签会在文章尾有介绍
在打包命令中使用到的有如下图三个命令
依次点击即可并保证控制台输出BUILD SUCCESS字样。
本人在package时提示Failed to execute goal org.codehaus.mojo:findbugs-maven-plugin:3.0.5:check (analyze-compile) on project netconf-java: failed with 2 bugs and 0 errors 。在pom.xml中删除对应的org.codehaus.mojo插件即可
最后就会在classes同级目录下生成对应的jar包
至此,打包已完成,只需要在目标项目中引入该jar包即可,如下图:
也可以:
<dependency> <groupId>xxx</groupId> <artifactId>xxx</artifactId> <version>v0.1</version> <scope>system</scope> <systemPath>${project.basedir}/lib/xxx.jar</systemPath> </dependency>
如果在使用该jar包时报错:Exception in thread "main" java.lang.NoClassDefFoundError,则应该是第三方依赖jar包没有导入到jar包中,回头检测pom.xml文件中对应的依赖包是否是<scope>compile</scope>。
<scope>的值的含义:
compile,缺省值,适用于所有阶段,会随着项目一起发布。
provided,类似compile,期望JDK、容器或使用者会提供这个依赖。如servlet.jar。
runtime,只在运行时使用,如JDBC驱动,适用运行和测试阶段。
test,只在测试时使用,用于编译和运行测试代码。不会随项目发布。
system,类似provided,需要显式提供包含依赖的jar,Maven不会在Repository中查找它。