`
chenzhou123520
  • 浏览: 4260683 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

阅读更多

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

maven-assembly-plugin

<plugin>
	<artifactId>maven-assembly-plugin</artifactId>
	<configuration>
		<appendAssemblyId>false</appendAssemblyId>
		<descriptorRefs>
			<descriptorRef>jar-with-dependencies</descriptorRef>
		</descriptorRefs>
		<archive>
			<manifest>
				<mainClass>com.chenzhou.examples.Main</mainClass>
			</manifest>
		</archive>
	</configuration>
	<executions>
		<execution>
			<id>make-assembly</id>
			<phase>package</phase>
			<goals>
				<goal>assembly</goal>
			</goals>
		</execution>
	</executions>
</plugin>

 

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

 

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

 

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-aop.jar包下META-INF文件夹下的内容

spring.schemas文件内容

图: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进行如下配置:

 

<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-shade-plugin</artifactId>
	<version>1.4</version>
	<executions>
		<execution>
			<phase>package</phase>
			<goals>
				<goal>shade</goal>
			</goals>
			<configuration>
				<transformers>
					<transformer
						implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
						<resource>META-INF/spring.handlers</resource>
					</transformer>
					<transformer
						implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
						<mainClass>com.chenzhou.examples.Main</mainClass>
					</transformer>
					<transformer
						implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
						<resource>META-INF/spring.schemas</resource>
					</transformer>
				</transformers>
			</configuration>
		</execution>
	</executions>
</plugin>

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

 

<transformer
	implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
	<resource>META-INF/spring.schemas</resource>
</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包就可以了。

参考资料:

http://hi.baidu.com/yuzhi2217/item/2c1714363f25c4f62684f442

http://blog.csdn.net/bluishglc/article/details/7596118

http://jira.codehaus.org/browse/MASSEMBLY-360

 

5
1
分享到:
评论
3 楼 evilseed 2014-09-01  
网上找了好多资料.都不是我遇到的问题.
基本上都说是缺少相应的jar包啊什么的.
原来你这个才是正解.
找了好久.终于看到了正解.
专门登录上来感谢一下.
2 楼 chenzhou123520 2014-04-02  
eddie_520 写道
我用你这种方法,打了jar包,可是还会出现Exception in thread "main" org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Unable to locate NamespaceHandler for namespace [http://www.springfr
amework.org/schema/context]的错误。
我查看我打包后的jar包内META-INF里的spring.schemas,spring.handlers,spring.factories里都有http\://www.springframework.org/schema/context=org.springframework.context.config.ContextNamespaceHandler的相关信息  包括
http\://www.springframework.org/schema/context/spring-context-3.2.xsd=org/springframework/context/config/spring-context-3.2.xsd等,可是执行就是出错,请给出点建议!谢谢~~~

不好意思,这几天没上iteye,刚刚才看到。你用的是maven-shade-plugin这个插件打包的么?
1 楼 eddie_520 2014-03-21  
我用你这种方法,打了jar包,可是还会出现Exception in thread "main" org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Unable to locate NamespaceHandler for namespace [http://www.springfr
amework.org/schema/context]的错误。
我查看我打包后的jar包内META-INF里的spring.schemas,spring.handlers,spring.factories里都有http\://www.springframework.org/schema/context=org.springframework.context.config.ContextNamespaceHandler的相关信息  包括
http\://www.springframework.org/schema/context/spring-context-3.2.xsd=org/springframework/context/config/spring-context-3.2.xsd等,可是执行就是出错,请给出点建议!谢谢~~~

相关推荐

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

    使用Maven插件对Java工程进行打包过程解析 Maven是一款流行的Java项目管理工具,它提供了许多插件来帮助开发者完成项目的构建、测试、打包等工作。其中,Maven Assembly插件是其中一个非常重要的插件,它可以帮助...

    Java+IDEA+maven混淆打包

    在`pom.xml`文件中,我们需要添加`maven-jar-plugin`插件来打包Java项目。以下是一个基本的配置示例: ```xml &lt;groupId&gt;org.apache.maven.plugins &lt;artifactId&gt;maven-jar-plugin &lt;version&gt;3.2.0 ...

    Gradle,Maven 插件将 Java 应用程序打包为原生 Windows、MacOS 或 Linux 可执行文件并为其创建安装程序 .zip

    Java打包器 JavaPackager 是Maven和Gradle的混合插件,它提供了一种将 Java 应用程序打包为原生 Windows、MacOS 或 GNU/Linux 可执行文件的简单方法,并为它们生成安装程序。重要的请参阅JavaPackager 的更改和修复...

    Java+IDEA+Maven混淆打包

    接下来,我们将按照以下步骤在IDEA中使用Maven进行混淆打包: **步骤1:设置Maven项目** 确保你的IDEA项目是一个Maven项目。如果还不是,可以右键点击项目 -&gt; "Add Framework Support" -&gt; 选择"Maven"进行添加。 ...

    Myeclipse6.5的Maven插件

    3. **构建与打包**:通过Maven插件,你可以执行`clean`、`compile`、`test`、`install`等生命周期目标,完成代码清理、编译、测试和打包等工作。 4. **配置管理**:Maven的`pom.xml`文件是项目的核心配置文件,插件...

    Myeclipse maven插件下载

    MyEclipse是一款强大的Java集成开发环境,它在Eclipse的基础上扩展了许多功能,尤其对Java EE项目的开发提供了更多支持。在现代软件开发过程中,Maven是一个不可或缺的构建和管理工具,它帮助开发者统一构建过程,...

    maven打包 maven打jar包详细步骤

    本文将详细讲解如何使用Maven来打包一个Java项目,并创建JAR文件。 首先,Maven有三个主要生命周期阶段:`clean`、`default`(也称为`compile`)和`install`。每个阶段包含一系列的阶段(或者称为目标,如`compile`...

    eclipse安装的maven插件

    7. **使用Maven插件**:在Eclipse中,你可以利用Maven插件进行各种操作,例如添加依赖、更新项目、构建项目等。在项目右键菜单中,有丰富的Maven选项供你选择。 8. **高级配置**:对于更复杂的Maven需求,如自定义...

    Maven创建Java工程

    在完成上述步骤后,可以在`mydemo`项目的根目录下执行`mvn compile`、`mvn install`或`mvn package`等命令,对项目进行编译、安装或打包操作。这些命令会自动传播至所有子模块,实现整个项目的构建和部署。 #### ...

    Maven使用命令创建工程,打包工程和常用命令使用的代码文件

    6. Maven插件: Maven通过插件扩展其功能,如maven-compiler-plugin用于编译,maven-surefire-plugin用于运行测试。插件配置在POM中,可以通过`&lt;build&gt;&lt;plugins&gt;`标签进行设置。 7. 配置Maven的本地和远程仓库: ...

    eclipse的maven插件

    Eclipse的Maven插件是开发Java项目时不可或缺的工具,它将强大的Maven构建系统与流行的Eclipse集成开发环境(IDE)相结合,为开发者提供了一站式解决方案。Maven是一个项目管理和综合工具,它通过定义项目的结构和...

    maven3.1、maven3.2安装包、源码及eclipse整合插件

    这个文件可能是Eclipse的一个旧版Maven插件,虽然现在推荐使用M2E,但如果你的环境需要,这个插件可以帮助你将Maven 3.1或3.2集成到Eclipse中。安装和配置方法与M2E类似,但可能需要手动更新Eclipse的工作空间配置...

    Maven自动升级版本号并打包上传的脚本

    同时,Maven插件如`versions-maven-plugin`和`maven-deploy-plugin`可以帮助我们完成版本升级和部署操作。 2. Maven的版本升级: 使用`versions-maven-plugin`插件,我们可以方便地更新项目及其依赖的版本号。例如...

    Apache Maven插件

    1. 构建管理:Maven插件可以自动编译源代码、运行测试、打包应用、生成文档等,使得开发者无需手动执行这些繁琐的任务。例如,常用的`mvn compile`命令用于编译源代码,`mvn test`执行单元测试,`mvn package`将编译...

    eclipse-maven插件

    在Eclipse中集成Maven插件,可以使得开发者在IDE内就能方便地进行Maven相关的操作,如编译、测试、打包等。本篇文章将详细介绍如何在Eclipse中离线安装Maven插件,并配置自定义的本地仓库路径。 首先,我们需要了解...

    自定义maven插件的实现

    然而,有时候Maven的内置插件无法满足特定的需求,这时就需要自定义Maven插件来扩展其功能。本篇文章将深入探讨如何实现自定义的Maven插件。 首先,了解Maven插件的基本结构至关重要。一个Maven插件通常由一组Mojo...

    maven插件for eclipse

    10. **远程调试**:通过Maven插件,开发者还可以配置远程调试,方便对分布式系统或服务进行调试。 总之,Maven插件为Eclipse提供了全面的Maven支持,使得Java开发者能够在统一的开发环境中高效地进行Maven项目的...

    eclipse安装maven插件

    Eclipse作为流行的Java集成开发环境(IDE),通过安装Maven插件,可以让开发者在Eclipse内部方便地进行Maven项目的开发和管理。下面我们将详细介绍如何在Eclipse中安装Maven插件。 首先,我们需要知道为什么要在...

    maven插件压缩包

    离线 Maven 插件压缩包则提供了本地化解决方案,它包含了一组预打包的插件,可以直接在本地环境中使用。 要使用这个离线 Maven 插件压缩包,首先需要将其解压到 Maven 的插件仓库目录。通常,这个路径为 `~/.m2/...

Global site tag (gtag.js) - Google Analytics