使用maven插件对java工程进行打包

现在基本上都是采用maven来进行开发管理,我有一个需求是需要把通过maven管理的java工程打成可执行的jar包,这样也就是说必需把工程依赖的jar包也一起打包。而使用maven默认的package命令构建的jar包中只包括了工程自身的class文件,并没有包括依赖的jar包。我们可以通过配置插件来对工程进行打包,pom具体配置如下:

maven-assembly-plugin

Xml代码  

  1. <plugin>
  2. <artifactId>maven-assembly-plugin</artifactId>
  3. <configuration>
  4. <appendAssemblyId>false</appendAssemblyId>
  5. <descriptorRefs>
  6. <descriptorRef>jar-with-dependencies</descriptorRef>
  7. </descriptorRefs>
  8. <archive>
  9. <manifest>
  10. <mainClass>com.chenzhou.examples.Main</mainClass>
  11. </manifest>
  12. </archive>
  13. </configuration>
  14. <executions>
  15. <execution>
  16. <id>make-assembly</id>
  17. <phase>package</phase>
  18. <goals>
  19. <goal>assembly</goal>
  20. </goals>
  21. </execution>
  22. </executions>
  23. </plugin>

其中<mainClass></mainClass>的值表示此工程的入口类,也就是包含main方法的类,在我的例子中就是com.chenzhou.examples.Main。配置完pom后可以通过执行mvn assembly:assembly命令来启动插件进行构建。构建成功后会生成jar包,这样我们就可以在命令行中通过java -jar XXX.jar来运行jar件了。

不过使用此插件会有一些问题:我在工程中依赖了spring框架的jar包,我打包成功后使用命令来调用jar包时报错如下(内网环境):

Shell代码  

  1. org.xml.sax.SAXParseException: schema_reference.4: Failed to read schema document ‘http://www.springframework.org/schema/beans/spring-beans-3.0.xsd‘, because 1) could not find the document; 2) the document could not be read; 3) the root element of the document is not <xsd:schema>.

关于此问题报错的原因,我在网上找到一篇文章对此有比较详细的解释:http://blog.csdn.net/bluishglc/article/details/7596118 简单来说就是spring在启动时会加载xsd文件,它首先会到本地查找xsd文件(一般都会包含在spring的jar包中),如果找不到则会到xml头部定义的url指定路径下中去寻找xsd,如果找不到则会报错。

附:在spring jar包下的META-INF文件夹中都会包含一个spring.schemas文件,其中就包含了对xsd文件的路径定义,具体如下图所示:

图:spring-aop.jar包下META-INF文件夹下的内容

图:spring.schemas文件内容

由于我的工程是在内网,所以通过url路径去寻找肯定是找不到的,但是比较奇怪的是既然spring的jar包中都会包含,那为什么还是找不到呢?

原来这是assembly插件的一个bug,具体情况参见:http://jira.codehaus.org/browse/MASSEMBLY-360

该bug产生的原因如下:工程一般依赖了很多的jar包,而被依赖的jar又会依赖其他的jar包,这样,当工程中依赖到不同的版本的spring时,在使用assembly进行打包时,只能将某一个版本jar包下的spring.schemas文件放入最终打出的jar包里,这就有可能遗漏了一些版本的xsd的本地映射,所以会报错。

所以一般推荐使用另外的一个插件来进行打包,插件名称为:maven-shade-plugin,shade插件打包时在对spring.schemas文件处理上,它能够将所有jar里的spring.schemas文件进行合并,在最终生成的单一jar包里,spring.schemas包含了所有出现过的版本的集合,要使用shade插件,必须在pom进行如下配置:

Xml代码  

  1. <plugin>
  2. <groupId>org.apache.maven.plugins</groupId>
  3. <artifactId>maven-shade-plugin</artifactId>
  4. <version>1.4</version>
  5. <executions>
  6. <execution>
  7. <phase>package</phase>
  8. <goals>
  9. <goal>shade</goal>
  10. </goals>
  11. <configuration>
  12. <transformers>
  13. <transformer
  14. implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
  15. <resource>META-INF/spring.handlers</resource>
  16. </transformer>
  17. <transformer
  18. implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
  19. <mainClass>com.chenzhou.examples.Main</mainClass>
  20. </transformer>
  21. <transformer
  22. implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
  23. <resource>META-INF/spring.schemas</resource>
  24. </transformer>
  25. </transformers>
  26. </configuration>
  27. </execution>
  28. </executions>
  29. </plugin>

上面配置文件中有一段定义:

Xml代码  

  1. <transformer
  2. implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
  3. <resource>META-INF/spring.schemas</resource>
  4. </transformer>

上面这段配置意思是把spring.handlers和spring.schemas文件以append方式加入到构建的jar包中,这样就不会存在出现xsd找不到的情况。

配置完pom后,调用mvn clean install命令进行构建,构建成功后打开工程target目录,发现生成了2个jar包,一个为:original-XXX-0.0.1-SNAPSHOT.jar,另一个为:XXX-0.0.1-SNAPSHOT.jar,其中original...jar里只包含了工程自己的class文件,而另外的一个jar包则包含了工程本身以及所有依赖的jar包的class文件。我们只需要使用第二个jar包就可以了。

时间: 2024-08-13 18:06:58

使用maven插件对java工程进行打包的相关文章

eclipse——Maven插件创建java工程

目录结构如下 注意默认JDK为1.5 更改默认JDK  方式一 右键工程 选中JRE1.5 Remove 双击JRE System Library 点击Finish 更改完成 方式二 配置maven settings.xml文件 设置通过Maven创建的工程的JDK版本——一劳永逸 [1]打开settings.xml文件 [2]找到profiles标签 [3]加入如下配置 <profile> <id>jdk-1.8</id> <activation> <

如何用jar命令对java工程进行打包

转自:http://www.blogjava.net/gosyl/archive/2008/04/18/194107.html 有时候为了更方便快捷的部署和执行Java程序,要把java应用程序打包成一个jar包.而这个基础的操作有时候也很麻烦,为了方便java程序员们能够方便的打包java应用程序,下面对jar命令进行介绍,并举出几个简单例子针对不同情况进行打包.        一. jar命令用法:         在cmd命令窗口下输入jar,回车,就会提示改命令的用法:         

Maven插件之portable-config-maven-plugin(不同环境打包)

大型项目中,分开发环境.测试环境.生产环境等; 不同环境,配置不同,或数据源,或服务器,或数据库等; 问题来了,如何使用Maven针对不同的环境来打包呢? Maven提供了Profile的概念,用来解决此类问题,其原理很简单,就是使用变量替换;举个例子来说明,测试项目目录结构如下图所示: 比如开发环境和生产环境的数据库不同,db.properties配置文件内容如下: [html] view plain copy #测试库 db.url=192.10.2.168 db.username=dbte

JAVA_SE基础——58.如何用jar命令对java工程进行打包

有时候为了更方便快捷的部署和执行Java程序,要把java应用程序打包成一个jar包.而这个基础的操作有时候也很麻烦,为了方便java程序员们能够方便的打包java应用程序,下面对jar命令进行介绍,并举出几个简单例子针对不同情况进行打包. jar命令用法: 在cmd命令窗口下输入jar,回车,就会提示改命令的用法: 打jar包: 需要使用到jdk的开发工具(jar.exe). jar文件的作用: 1. 方便用户快速运行一个项目. 2. 提供工具类以jar包的形式给别人使用. 如果使用jar包里

Java爬虫框架SeimiCrawler的工程自动打包工具使用

为了便于开发者对使用SeimiCrawler框架开发的爬虫工程的打包部署,SeimiCrawler现已推出maven-seimicrawler-plugin,一个maven工程的自动化打包插件.下面简要介绍下他的使用. 开始 pom添加添加plugin <plugin> <groupId>cn.wanghaomiao</groupId> <artifactId>maven-seimicrawler-plugin</artifactId> <

淘淘商城系列——使用maven tomcat插件启动web工程

上文我们一起学习了怎样搭建maven工程,这篇文章我就来教大家一起学习怎样用tomcat插件来启动web工程. 我们把服务层和表现层的工程都创建好了,目前来说,其实真正能运行的就2个,一个是表现层工程——taotao-manager-web,一个服务层工程——taotao-manager.本文先来看表现层工程,它可以独立运行,它应该怎么运行呢? 为何要用maven tomcat插件来启动web工程? 如果要运行表现层工程,那么应该在其pom.xml文件中配置一个maven的tomcat插件,而不

基于maven搭建的struts 1 java工程

今天在家尝试搭建和公司一样的开发环境(struts1+maven+resin),结果遇到很多的问题,记录下来,如果遇到相似问题,可参考: 我的工程下载地址:http://files.cnblogs.com/files/focusahaha/struts1.rar maven maven值得注意的地方其实只有conf文件夹的setting.xml文件,其实不用任何设置就可以使用了.但是也可以通过修改这个文件,手动设置本地maven库的位置,使用镜像(如果使用的是本公司自主搭建的maven库),使用

在 eclipse 中 maven 插件的设置以及 maven 工程在 eclipse中的相关使用问题

1.在 eclipse 中使用 maven: a.在 eclipse 中 maven 插件是内置的. b.maven插件的相关设置,在 Window --> Preferences --> Maven 中设置两项内容: 注:在 Installations 中 点击 add...,后把自己安装的 apache-maven-3.2.2 定为安装目录. 注:在 User Settings 中 设置为自己安装的 apache-maven-3.2.2/conf 目录下的 settings.xml 文件,

使用Maven构建一个简单的java工程

原文是我在学习Spring的过程中,在Spring的官网上看到的一个指南:BuildingJava Projects with Maven--http://spring.io/guides/gs/maven/#scratch.我也是刚接触Maven.看到这篇文章觉得非常简单,但又非常实用,尤其是对于像我这样的Maven初学者.基本上看了这篇后能大概知道Maven是个什么东西,干点什么事,并能够上手使用Maven做点小例子.所以忍不住就把它整理成中文,发出来分享一下,帮助初学者.并没有对原文完整翻