项目中,需要引入本地自己的sdk,因为对maven不熟悉,自己查看了许多其他朋友的资料,
下面总结记录下,希望可以帮忙到其他朋友。
maven打包main函数运行的jar方式
1. maven-shade-plugin
2. maven-assembly-plugin
3. maven-onejar-plugin
因为现在项目中有使用Spring,使用第二种方式的话,将会出现spring加载的错误,所以不使用。
现在主要介绍1和3两种。
1. maven-shade-plugin
现在项目中使用的就是 1打成jar文件,具体pom文件如下。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0modelVersion> <groupId>com.shiyi.kmtaskgroupId> <artifactId>shiyi-kmtaskartifactId> <version>0.0.1-SNAPSHOTversion> <properties> <project.build.sourceEncoding>UTF-8project.build.sourceEncoding> <cxf.version>2.6.1cxf.version> <spring.version>3.2.5.RELEASEspring.version> properties> <dependencies> <dependency> <groupId>junitgroupId> <artifactId>junitartifactId> <version>4.8.2version> <scope>testscope> dependency> <dependency> <groupId>org.apache.httpcomponentsgroupId> <artifactId>httpclientartifactId> <version>4.4.1version> dependency> <dependency> <groupId>org.apache.httpcomponentsgroupId> <artifactId>httpcoreartifactId> <version>4.4.1version> dependency> <dependency> <groupId>log4jgroupId> <artifactId>log4jartifactId> <version>1.2.17version> dependency> <dependency> <groupId>org.mybatisgroupId> <artifactId>mybatisartifactId> <version>3.2.7version> dependency> <dependency> <groupId>mysqlgroupId> <artifactId>mysql-connector-javaartifactId> <version>5.1.33version> dependency> <dependency> <groupId>com.sun.jnagroupId> <artifactId>jnaartifactId> <version>3.0.9version> dependency> <dependency> <groupId>org.apache.commonsgroupId> <artifactId>commons-compressartifactId> <version>1.9version> dependency> <dependency> <groupId>org.apache.commonsgroupId> <artifactId>commons-collections4artifactId> <version>4.0version> dependency> <dependency> <groupId>com.rabbitmqgroupId> <artifactId>amqp-clientartifactId> <version>3.2.1version> dependency> <dependency> <groupId>commons-iogroupId> <artifactId>commons-ioartifactId> <version>1.2version> dependency> <dependency> <groupId>commons-cligroupId> <artifactId>commons-cliartifactId> <version>1.1version> dependency> <dependency> <groupId>dom4jgroupId> <artifactId>dom4jartifactId> <version>1.6.1version> dependency> <dependency> <groupId>org.apache.cxfgroupId> <artifactId>cxf-rt-transports-httpartifactId> <version>${cxf.version}version> dependency> <dependency> <groupId>org.apache.cxfgroupId> <artifactId>cxf-rt-frontend-jaxwsartifactId> <version>${cxf.version}version> dependency> <dependency> <groupId>org.apache.commonsgroupId> <artifactId>commons-lang3artifactId> <version>3.3.2version> dependency> <dependency> <groupId>com.qiniugroupId> <artifactId>qiniu-java-sdkartifactId> <version>[7.0.0, 7.0.99]version> dependency> <dependency> <groupId>com.alibabagroupId> <artifactId>fastjsonartifactId> <version>1.1.41version> dependency> <dependency> <groupId>org.mybatisgroupId> <artifactId>mybatis-springartifactId> <version>1.2.2version> dependency> <dependency> <groupId>org.springframeworkgroupId> <artifactId>spring-contextartifactId> <version>${spring.version}version> dependency> <dependency> <groupId>commons-dbcpgroupId> <artifactId>commons-dbcpartifactId> <version>1.4version> dependency> <dependency> <groupId>org.springframeworkgroupId> <artifactId>spring-aopartifactId> <version>${spring.version}version> dependency> <dependency> <groupId>org.springframeworkgroupId> <artifactId>spring-beansartifactId> <version>${spring.version}version> dependency> <dependency> <groupId>org.springframeworkgroupId> <artifactId>spring-expressionartifactId> <version>${spring.version}version> dependency> <dependency> <groupId>commons-poolgroupId> <artifactId>commons-poolartifactId> <version>1.6version> dependency> <dependency> <groupId>org.springframeworkgroupId> <artifactId>spring-coreartifactId> <version>${spring.version}version> dependency> <dependency> <groupId>org.springframeworkgroupId> <artifactId>spring-jdbcartifactId> <version>${spring.version}version> dependency> <dependency> <groupId>org.springframeworkgroupId> <artifactId>spring-txartifactId> <version>${spring.version}version> dependency> <dependency> <groupId>org.slf4jgroupId> <artifactId>slf4j-apiartifactId> <version>1.7.6version> dependency> dependencies> <build> <finalName>KMTaskServicefinalName> <plugins> <plugin> <artifactId>maven-shade-pluginartifactId> <version>1.4version> <executions> <execution> <phase>packagephase> <goals> <goal>shadegoal> goals> <configuration> <filters> <filter> <artifact>*:*artifact> <excludes> <exclude>META-INF/*.SFexclude> <exclude>META-INF/*.DSAexclude> <exclude>META-INF/*.RSAexclude> <exclude>**/config.propertiesexclude> <exclude>**/checkdll.dllexclude> <exclude>**/EnDeCrypinfo.hexclude> <exclude>**/EnDecryption.dllexclude> <exclude>**/libcheck.soexclude> <exclude>**/libEnDecryption.soexclude> <exclude>**/libmad.soexclude> <exclude>**/libmad.so.0exclude> <exclude>**/libmad.so.0.2.1exclude> <exclude>**/rdck.cfgexclude> excludes> filter> filters> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <manifestEntries> <Main-Class>com.shiyi.autoservice.main.TaskServiceMainMain-Class> <Build-Number>1.0.2Build-Number> <X-Compile-Source-JDK>${maven.compile.source}X-Compile-Source-JDK> <X-Compile-Target-JDK>${maven.compile.target}X-Compile-Target-JDK> manifestEntries> transformer> <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> <resource>META-INF/spring.handlersresource> transformer> <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> <resource>META-INF/spring.schemasresource> transformer> transformers> configuration> execution> executions> plugin> plugins> build> project>
现在需要加入本地的sdk,
(1)不去本地仓库查找,在自己环境中
因为使用的是maven-shade-plugin插件,打包后,你将发现实际上,本地的sdk并没有存在。
原因是因为,使用shade插件的时候,它将直接无视scope为system的jar !!!
所以此方法失败了。
(2)将sdk加入本地仓库,然后正常使用,步骤如下:
1.将sdk加入本地仓库
mvn install:install-file -Dfile=D:\Users\User\workspace\KMFtpDataClient\src\main\lib\monitor.sdk.java.jar -DgroupId=km -DartifactId=monitor
-Dversion=1.0 -Dpackaging=jar
2.maven中使用
这个方法可以使用,但是如果其他同事svn引入代码的时候,因为他的本地仓库没有这个jar,将出现错误,所以
最后将它加入自己的中央仓库中。
3. maven-onejar-plugin
先在pom中加入
然后打包build中代码如下:
<build> <finalName>KMTaskServicefinalName> <plugins> <plugin> <groupId>org.apache.maven.pluginsgroupId> <artifactId>maven-jar-pluginartifactId> <configuration> <archive> <manifest> <mainClass>com.shiyi.autoservice.main.TaskServiceMainmainClass> manifest> archive> <excludes> <exclude>META-INF/*.SFexclude> <exclude>META-INF/*.DSAexclude> <exclude>META-INF/*.RSAexclude> <exclude>**/config.propertiesexclude> <exclude>**/checkdll.dllexclude> <exclude>**/EnDeCrypinfo.hexclude> <exclude>**/EnDecryption.dllexclude> <exclude>**/libcheck.soexclude> <exclude>**/libEnDecryption.soexclude> <exclude>**/libmad.soexclude> <exclude>**/libmad.so.0exclude> <exclude>**/libmad.so.0.2.1exclude> <exclude>**/rdck.cfgexclude> excludes> configuration> plugin> <plugin> <groupId>com.joliragroupId> <artifactId>onejar-maven-pluginartifactId> <version>1.4.4version> <executions> <execution> <configuration> <attachToBuild>trueattachToBuild> <classifier>onejarclassifier> configuration> <goals> <goal>one-jargoal> goals> execution> executions> plugin> plugins> build>
以上方法也可以正常运行。至于两种方法的优势,就不是很清楚了。
另外,在运行的过称中,出现了大量的重复类。
查看依赖树并没有发现有重复冲突的依赖包(依赖树介绍:http://ian.wang/106.htm)
后来才发现,原来自己本地的sdk中有出现在实际项目中一个的jar,然后并没有以依赖包的形式存在,
而是直接编译在sdk中。
情况大致如下:
本地sdk的pom.xml与项目的pom.xml都有下面依赖存在
这种情况,依赖树并不能检查出重复,但是编译的时候,却出现了类重复的警告。
以上对策:
1.无视它,目前没发现对实际运行有影响
2,注释掉项目中与sdk重复的依赖包(额,自己去找,也是很坑的)
3.修正sdk,最好依赖的包别直接编译进sdk中
以上,都是个人的见解,如果有更好的对策或者不对的地方,欢迎各位朋友告知,谢谢。