maven 打包可执行jarprovided jar 包也会打进去怎么解决

maven中把依赖的JAR包一起打包 - lvjun106 - ITeye博客
博客分类:
这里所用到的MAVEN-PLUGIN是MAVNE-ASSEMBLY-PLUGIN
官方网站是:
1. 添加此PLUGIN到项目的POM.XML中
&artifactId&maven-assembly-plugin&/artifactId&
&configuration&
&manifest&
&mainClass&com.allen.capturewebdata.Main&/mainClass&
&/manifest&
&/archive&
&descriptorRefs&
&descriptorRef&jar-with-dependencies&/descriptorRef&
&/descriptorRefs&
&/configuration&
&/plugins&
如果出现CLASS重名的情况,这时候就要把最新的版本号添加进去即可,
2, 在当前项目下执行mvn assembly:assembly, 执行成功后会在target文件夹下多出一个以-jar-with-dependencies结尾的JAR包. 这个JAR包就包含了项目所依赖的所有JAR的CLASS.
3.如果不希望依赖的JAR包变成CLASS的话,可以修改ASSEMBLY插件.
3.1 找到assembly在本地的地址,一般是c:/users/${your_login_name}/.m2/\org\apache\maven\plugins\maven-assembly-plugin\2.4
3.2 用WINZIP或解压工具打开此目录下的maven-assembly-plugin-2.4.jar, 找到assemblies\jar-with-dependencies.xml
3.3 把里面的UNPACK改成FALSE即可
浏览 85241
浏览: 233718 次
来自: 芜湖
还有屌丝啊
非常好啊......
为什么我执行(生成的不以-jar-with-depend ...
怒赞一个!!!很棒!
关键是,我想mvn package就打包好,请问,怎么做> 博客详情
摘要: Maven解决类包依赖冲突
使用maven最烦人的可能就是类包之间的版本冲突引发的问题了,类包冲突的一个很大的原因即产类包之间的间接依赖引起的。每个显式声明的类包都会依赖于一些其它的隐式类包,这些隐式的类包会被maven间接引入进来,因而可能造成一个我们不想要的类包的载入,严重的甚至会引起类包之间的冲突。&要解决这个问题,首先就是要查看pom.xml显式和隐式的依赖类包,然后通过这个类包树找出我们不想要的依赖类包,手工将其排除在外就可以了。&下面,通过一个例子来说明:&我的项目使用testng进行测试,使用了untilis,由于unitils的类包会隐式依赖于junit,这是我不想看到的,下面的目的就是找出junit会谁隐式载入了,然后exculte掉它。&通过idea的maven依赖分析将不需要的依赖exclude掉&打开maven的pom.xml,在某个&dependency&中通过右键菜单:maven-&show dependency 打开分析的图形化页面,如下所示:&通过菜单的exclude即解决这个间接依赖。&通过这个依赖树,我们还可以看到Junit还通过“unitils-spring”的依赖间接载入了,如下所示:&从上面的依赖树中,我们可以看出junit通过unitils-spring的unitils-database间接引入了,由于我的项目都不需要数据库的测试,因此,可以把unitils-database项整个exclude掉。&下面,是处理完成后的pom.xml关键片断:&
&&&&&dependency&&&
&&&&&&&&&groupId&org.unitils&/groupId&&&
&&&&&&&&&artifactId&unitils-testng&/artifactId&&&
&&&&&&&&&version&${unitils.version}&/version&&&
&&&&&&&&&scope&test&/scope&&&
&&&&&&&&&exclusions&&&
&&&&&&&&&&&&&exclusion&&&
&&&&&&&&&&&&&&&&&artifactId&junit&/artifactId&&&
&&&&&&&&&&&&&&&&&groupId&junit&/groupId&&&
&&&&&&&&&&&&&/exclusion&&&
&&&&&&&&&/exclusions&&&
&&&&&/dependency&&&
&&&&&dependency&&&
&&&&&&&&&groupId&org.unitils&/groupId&&&
&&&&&&&&&artifactId&unitils-spring&/artifactId&&&
&&&&&&&&&version&${unitils.version}&/version&&&
&&&&&&&&&scope&test&/scope&&&
&&&&&&&&&exclusions&&&
&&&&&&&&&&&&&exclusion&&&
&&&&&&&&&&&&&&&&&artifactId&unitils-database&/artifactId&&&
&&&&&&&&&&&&&&&&&groupId&org.unitils&/groupId&&&
&&&&&&&&&&&&&/exclusion&&&
&&&&&&&&&/exclusions&&&
&&&&&/dependency&&&
&/dependencies&&&
这样,被间接隐式引入的junit就被我们exclude在外了。&有时通过idea的依赖分析工具产生的树不够全,这时就需要使用mvn dependency:tree来查看依赖树了。&通过mvn dependency:tree 查看依赖树&
mvn dependency:tree
以下是使用这个工具产生的依赖树:&
E:\01workspace\chenxh\09research\rop\rop&mvn dependency:tree&[WARNING]&[WARNING] Some problems were encountered while building the effective settings&[WARNING] 'pluginRepositories.pluginRepository.id' must not be 'local', this identifier is reserved for the local re&tory, using it for other repositories will corrupt your repository metadata. @ C:\Users\Administrator\.m2\settings.x&[WARNING]&[INFO] Scanning for projects...&[INFO]&[INFO] ------------------------------------------------------------------------&[INFO] Building rop 1.0-SNAPSHOT&[INFO] ------------------------------------------------------------------------&[INFO]&[INFO] --- maven-dependency-plugin:2.1:tree (default-cli) @ rop ---&[INFO] com.rop:rop:jar:1.0-SNAPSHOT&[INFO] +- javax.validation:validation-api:jar:1.0.0.GA:compile&[INFO] +- org.hibernate:hibernate-validator:jar:4.2.0.Final:compile&[INFO] +- org.codehaus.jackson:jackson-core-asl:jar:1.9.5:compile&[INFO] +- org.codehaus.jackson:jackson-mapper-asl:jar:1.9.5:compile&[INFO] +- org.codehaus.jackson:jackson-jaxrs:jar:1.9.5:compile&[INFO] +- org.codehaus.jackson:jackson-xc:jar:1.9.5:compile&[INFO] +- com.fasterxml.jackson.dataformat:jackson-dataformat-xml:jar:2.0.0-RC2:compile&[INFO] |& +- com.fasterxml.jackson.core:jackson-core:jar:2.0.0-RC2:compile&[INFO] |& +- com.fasterxml.jackson.core:jackson-annotations:jar:2.0.0-RC2:compile&[INFO] |& +- com.fasterxml.jackson.core:jackson-databind:jar:2.0.0-RC2:compile&[INFO] |& +- com.fasterxml.jackson.module:jackson-module-jaxb-annotations:jar:2.0.0-RC2:compile&[INFO] |& \- org.codehaus.woodstox:stax2-api:jar:3.1.1:compile&[INFO] |&&&& \- javax.xml.stream:stax-api:jar:1.0-2:compile&[INFO] +- org.slf4j:slf4j-api:jar:1.6.1:compile&[INFO] +- org.slf4j:slf4j-log4j12:jar:1.6.1:compile&[INFO] +- log4j:log4j:jar:1.2.16:compile&[INFO] +- org.springframework:spring-core:jar:3.1.1.RELEASE:compile&[INFO] |& +- org.springframework:spring-asm:jar:3.1.1.RELEASE:compile&[INFO] |& \- commons-logging:commons-logging:jar:1.1.1:compile&[INFO] +- org.springframework:spring-context:jar:3.1.1.RELEASE:compile&[INFO] |& +- org.springframework:spring-aop:jar:3.1.1.RELEASE:compile&[INFO] |& +- org.springframework:spring-beans:jar:3.1.1.RELEASE:compile&[INFO] |& \- org.springframework:spring-expression:jar:3.1.1.RELEASE:compile&[INFO] +- org.springframework:spring-context-support:jar:3.1.1.RELEASE:compile&[INFO] +- org.springframework:spring-web:jar:3.1.1.RELEASE:compile&[INFO] |& \- aopalliance:aopalliance:jar:1.0:compile&[INFO] +- org.springframework:spring-test:jar:3.1.1.RELEASE:compile&[INFO] +- org.springframework:spring-webmvc:jar:3.1.1.RELEASE:compile&[INFO] +- org.testng:testng:jar:6.3:test&[INFO] |& +- org.beanshell:bsh:jar:2.0b4:test&[INFO] |& +- com.beust:jcommander:jar:1.12:test&[INFO] |& \- org.yaml:snakeyaml:jar:1.6:test&[INFO] +- org.mockito:mockito-all:jar:1.8.5:test&[INFO] +- javax.servlet:servlet-api:jar:2.5:provided&[INFO] +- org.unitils:unitils-core:jar:3.3:test&[INFO] |& +- commons-lang:commons-lang:jar:2.3:test&[INFO] |& +- commons-collections:commons-collections:jar:3.2:test&[INFO] |& \- ognl:ognl:jar:2.6.9:test&[INFO] +- org.unitils:unitils-testng:jar:3.3:test&[INFO] |& \- org.testng:testng:jar:jdk15:5.8:test&[INFO] |&&&& \- junit:junit:jar:3.8.1:test&[INFO] \- org.unitils:unitils-spring:jar:3.3:test&[INFO]&&& +- org.springframework:spring-tx:jar:2.5.2:test&[INFO]&&& \- org.unitils:unitils-database:jar:3.3:test&[INFO]&&&&&& +- org.unitils:unitils-dbmaintainer:jar:3.3:test&[INFO]&&&&&& |& +- org.hibernate:hibernate:jar:3.2.5.ga:test&[INFO]&&&&&& |& |& +- net.sf.ehcache:ehcache:jar:1.2.3:test&[INFO]&&&&&& |& |& +- asm:asm-attrs:jar:1.5.3:test&[INFO]&&&&&& |& |& +- dom4j:dom4j:jar:1.6.1:test&[INFO]&&&&&& |& |& +- antlr:antlr:jar:2.7.6:test&[INFO]&&&&&& |& |& +- cglib:cglib:jar:2.1_3:test&[INFO]&&&&&& |& |& \- asm:asm:jar:1.5.3:test&[INFO]&&&&&& |& \- org.dbunit:dbunit:jar:2.2.2:test&[INFO]&&&&&& |&&&& +- junit-addons:junit-addons:jar:1.4:test&[INFO]&&&&&& |&&&& |& +- xerces:xercesImpl:jar:2.6.2:test&[INFO]&&&&&& |&&&& |& \- xerces:xmlParserAPIs:jar:2.6.2:test&[INFO]&&&&&& |&&&& +- poi:poi:jar:2.5.1-final-:test&[INFO]&&&&&& |&&&& \- org.slf4j:slf4j-nop:jar:1.4.3:test&[INFO]&&&&&& +- commons-dbcp:commons-dbcp:jar:1.2.2:test&[INFO]&&&&&& |& \- commons-pool:commons-pool:jar:1.3:test&[INFO]&&&&&& \- org.springframework:spring-jdbc:jar:2.5.2:test&[INFO] ------------------------------------------------------------------------&[INFO] BUILD SUCCESS&[INFO] ------------------------------------------------------------------------&[INFO] Total time: 8.250s&[INFO] Finished at: Fri Jun 08 09:08:09 CST 2012&[INFO] Final Memory: 7M/245M&[INFO] ------------------------------------------------------------------------&
我原来一个使用idea分析不出的隐式依赖就是通用mvn dependency:tree找到的。
人打赏支持
码字总数 6980
支付宝支付
微信扫码支付
打赏金额: ¥
已支付成功
打赏金额: ¥Maven怎么处理引用的jar版本冲突? - maven - ITeye群组
& 上一页 1
我找到的个项目 AAA的,但是用的是lucene3.0. 而我们现在的工程BBB里面已经用了lucene2.9-----我们的项目用这个AAA怎么处理lucene冲突啊?
&dependency&& &artifactId&aaa&/& &exclusions&&&& &exclusion&&&&&& &artifactId&lucene&/...
同一个artifactId,maven只会加载版本高的jar。不研究过,不十分确定这样的机制。
有同样的问题,当项目中依赖的两个包版本不一致的时候出现问题,我用的包是com.google.protobuffer,2.1和2.3冲突,用了一楼的做法,没有效果呀。
peizhyi 写道有同样的问题,当项目中依赖的两个包版本不一致的时候出现问题,我用的包是com.google.protobuffer,2.1和2.3冲突,用了一楼的做法,没有效果呀。
首先在 自己的 pom 中,人为不可能引入两个版本不同的依赖。冲突最可能的就是你依赖的依赖可能产生了冲突。
比如 A 依赖 版本为2.0 的 C ,B 依赖 版本为3.0的 C。在你的pom中,你同时依赖了 A 和 B ,这时就会产生冲突。这时候你就要判断,哪个版本能同时让A和B工作(如果可以的话),然后排除掉另一个就行了。我通常都是排除掉较低的版本。
&dependencies&
&dependency&
&groupId&A&/groupId&
&artifactId&A&/artifactId&
&version&xxx&/version&
&exclusions&
&exclusion&
&groupId&C&/groupId&
&artifactId&C&/artifactId&
&/exclusion&
&/exclusions&
&/dependency&
&dependency&
&groupId&B&/groupId&
&artifactId&B&/artifactId&
&/dependency&
&/dependencies&
bastengao 写道peizhyi 写道有同样的问题,当项目中依赖的两个包版本不一致的时候出现问题,我用的包是com.google.protobuffer,2.1和2.3冲突,用了一楼的做法,没有效果呀。
首先在 自己的 pom 中,人为不可能引入两个版本不同的依赖。冲突最可能的就是你依赖的依赖可能产生了冲突。
比如 A 依赖 版本为2.0 的 C ,B 依赖 版本为3.0的 C。在你的pom中,你同时依赖了 A 和 B ,这时就会产生冲突。这时候你就要判断,哪个版本能同时让A和B工作(如果可以的话),然后排除掉另一个就行了。我通常都是排除掉较低的版本。
&dependencies&
&dependency&
&groupId&A&/groupId&
&artifactId&A&/artifactId&
&version&xxx&/version&
&exclusions&
&exclusion&
&groupId&C&/groupId&
&artifactId&C&/artifactId&
&/exclusion&
&/exclusions&
&/dependency&
&dependency&
&groupId&B&/groupId&
&artifactId&B&/artifactId&
&/dependency&
&/dependencies&
比较让人郁闷的问题是,用了2.0的缺方法一,用了3.0的缺方法二。。这种问题还有解吗?
那这就是硬伤了
peizhyi 写道bastengao 写道peizhyi 写道有同样的问题,当项目中依赖的两个包版本不一致的时候出现问题,我用的包是com.google.protobuffer,2.1和2.3冲突,用了一楼的做法,没有效果呀。
首先在 自己的 pom 中,人为不可能引入两个版本不同的依赖。冲突最可能的就是你依赖的依赖可能产生了冲突。
比如 A 依赖 版本为2.0 的 C ,B 依赖 版本为3.0的 C。在你的pom中,你同时依赖了 A 和 B ,这时就会产生冲突。这时候你就要判断,哪个版本能同时让A和B工作(如果可以的话),然后排除掉另一个就行了。我通常都是排除掉较低的版本。
&dependencies&
&dependency&
&groupId&A&/groupId&
&artifactId&A&/artifactId&
&version&xxx&/version&
&exclusions&
&exclusion&
&groupId&C&/groupId&
&artifactId&C&/artifactId&
&/exclusion&
&/exclusions&
&/dependency&
&dependency&
&groupId&B&/groupId&
&artifactId&B&/artifactId&
&/dependency&
&/dependencies&
比较让人郁闷的问题是,用了2.0的缺方法一,用了3.0的缺方法二。。这种问题还有解吗?
同求啊。发生了同样的问题。 两个版本,高版本不兼容低版本的方法。目前的方案有两个 。一个是把其中的一个版本的maven坐标更换了,让两个都加载。不过还没有验证过。应该也会有问题。另外一个方法就是把低版本的包路径全部更换,再更换低版本的maven坐标,防止冲突。但是这些方法太繁琐,而且感觉不靠谱呀!有没有更好的方法解决?
cosmo1987 写道peizhyi 写道bastengao 写道peizhyi 写道有同样的问题,当项目中依赖的两个包版本不一致的时候出现问题,我用的包是com.google.protobuffer,2.1和2.3冲突,用了一楼的做法,没有效果呀。
首先在 自己的 pom 中,人为不可能引入两个版本不同的依赖。冲突最可能的就是你依赖的依赖可能产生了冲突。
比如 A 依赖 版本为2.0 的 C ,B 依赖 版本为3.0的 C。在你的pom中,你同时依赖了 A 和 B ,这时就会产生冲突。这时候你就要判断,哪个版本能同时让A和B工作(如果可以的话),然后排除掉另一个就行了。我通常都是排除掉较低的版本。
&dependencies&
&dependency&
&groupId&A&/groupId&
&artifactId&A&/artifactId&
&version&xxx&/version&
&exclusions&
&exclusion&
&groupId&C&/groupId&
&artifactId&C&/artifactId&
&/exclusion&
&/exclusions&
&/dependency&
&dependency&
&groupId&B&/groupId&
&artifactId&B&/artifactId&
&/dependency&
&/dependencies&
比较让人郁闷的问题是,用了2.0的缺方法一,用了3.0的缺方法二。。这种问题还有解吗?
同求啊。发生了同样的问题。 两个版本,高版本不兼容低版本的方法。目前的方案有两个 。一个是把其中的一个版本的maven坐标更换了,让两个都加载。不过还没有验证过。应该也会有问题。另外一个方法就是把低版本的包路径全部更换,再更换低版本的maven坐标,防止冲突。但是这些方法太繁琐,而且感觉不靠谱呀!有没有更好的方法解决?
现在想想看,有一个方法相对可行。把应用这两个版本不同方法的部分,拆成两个子项目,两个子项目各自引用不同版本的包。这样就能够同时引用,也不会冲突。
peizhyi 写道cosmo1987 写道peizhyi 写道bastengao 写道peizhyi 写道有同样的问题,当项目中依赖的两个包版本不一致的时候出现问题,我用的包是com.google.protobuffer,2.1和2.3冲突,用了一楼的做法,没有效果呀。
首先在 自己的 pom 中,人为不可能引入两个版本不同的依赖。冲突最可能的就是你依赖的依赖可能产生了冲突。
比如 A 依赖 版本为2.0 的 C ,B 依赖 版本为3.0的 C。在你的pom中,你同时依赖了 A 和 B ,这时就会产生冲突。这时候你就要判断,哪个版本能同时让A和B工作(如果可以的话),然后排除掉另一个就行了。我通常都是排除掉较低的版本。
&dependencies&
&dependency&
&groupId&A&/groupId&
&artifactId&A&/artifactId&
&version&xxx&/version&
&exclusions&
&exclusion&
&groupId&C&/groupId&
&artifactId&C&/artifactId&
&/exclusion&
&/exclusions&
&/dependency&
&dependency&
&groupId&B&/groupId&
&artifactId&B&/artifactId&
&/dependency&
&/dependencies&
比较让人郁闷的问题是,用了2.0的缺方法一,用了3.0的缺方法二。。这种问题还有解吗?
同求啊。发生了同样的问题。 两个版本,高版本不兼容低版本的方法。目前的方案有两个 。一个是把其中的一个版本的maven坐标更换了,让两个都加载。不过还没有验证过。应该也会有问题。另外一个方法就是把低版本的包路径全部更换,再更换低版本的maven坐标,防止冲突。但是这些方法太繁琐,而且感觉不靠谱呀!有没有更好的方法解决?
现在想想看,有一个方法相对可行。把应用这两个版本不同方法的部分,拆成两个子项目,两个子项目各自引用不同版本的包。这样就能够同时引用,也不会冲突。
拆成两个子项目,如果是指maven项目下的两个module的话,最后构建maven的web项目时两个module所依赖的jar会打包到一个war中。问题没有解决。而如果是指两个maven项目并且分别部署的话,这样仅仅为了隔离jar依赖而拆项目,这个项目也不好拆。毕竟拆项目的依据还是在当一个应用过大,需要降低耦合划分成两个子系统的时候才需要做。之前又想到两个解决方案。不过还有待权衡。1.引入OSGI架构。架构的引入可以很好的以组件的形式可插拔的更换模块,并且可以很好的做到jar隔离。但是OGSI的引入又会带来很多其他的麻烦。学习成本增加,OSGI的引入必然带来整个项目结构的变动,而且引入OSGI后,所有的模块都必须以OSGI的方式进行,对于一些觉得很简单且没有必要使用OSGI方式编写的代码,不能被OSGI引用。2.自己实现web container下一级的application classloader。对于一些特殊的jar使用配置的方式让自己实现的classloader进行加载。在classloader这一层做到隔离后的jar相互调用问题。这个classloader的实现确实是一个技术活。需要解决很多问题。开发成本提高很多。目前为止还是没有想出简单方便的方法解决这个问题。
& 上一页 12016年1月 Java大版内专家分月排行榜第二2015年12月 Java大版内专家分月排行榜第二2015年8月 Java大版内专家分月排行榜第二2015年3月 Java大版内专家分月排行榜第二2015年1月 Java大版内专家分月排行榜第二2014年12月 Java大版内专家分月排行榜第二2014年11月 Java大版内专家分月排行榜第二2014年6月 Java大版内专家分月排行榜第二2014年4月 Java大版内专家分月排行榜第二2014年1月 Java大版内专家分月排行榜第二2013年11月 Java大版内专家分月排行榜第二
2015年9月 Java大版内专家分月排行榜第三2015年6月 Java大版内专家分月排行榜第三2015年5月 Java大版内专家分月排行榜第三2015年2月 Java大版内专家分月排行榜第三2014年3月 Java大版内专家分月排行榜第三2013年12月 Java大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。09:37 提问
maven项目中关于jar包冲突的问题
最近刚开始研究ssm框架,使用maven,按照网上流程部署好之后启动,打开jsp,会发现一个错误javax.servlet.ServletException: java.lang.LinkageError: loader constraint violation: loader (instance of org/apache/jasper/servlet/JasperLoader) previously initiated loading for a different type with name "javax/servlet/http/HttpServletRequest"
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:268)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
上网查了是jar包冲突的问题,测试之后发现是因为导入了java ee jar 包,provided之后就好了,我想问的是eclipse中自带有这个包吗?这个包是否需要导入?如果不导入的话会不会导致功能缺失?还有provided之后和不加这句有什么影响?我是一个java小菜鸟,希望得到大家的不吝赐教,关于mvn dependency:tree这个命令如何看哪些jar包冲突有没有什么指导或者技术链接也可以留言,谢谢!
按赞数排序
----------------------biu~biu~biu~~~在下问答机器人小D,这是我依靠自己的聪明才智给出的答案,如果不正确,你来咬我啊!
尝试使用maven clean一下,网上的解释是说jar包冲突,这个错误我也出现过,clean一下,然后重新install,就OK了。

我要回帖

更多关于 maven 打包可执行jar 的文章

 

随机推荐