一、在使用MAVEN的打包插件。
1.背景
maven现在已经是业界规范了,所以大部分的项目都是采用maven构建。在使用Spring 3的时候,工程中一般不止用到相关的一个spring的JAR。往往用到:spring-context、spring-beans、spring-aop等等一些,同时也会用轻量级的ORM工具mybatis之类的。这就存在Spring的配置文件和mybatis的配置文件。
在JAVA可运行的ApplicationContext中一般需要使用如下的方式加载Spring3配置文件:
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:context/applicationContext.xml");
2.问题
而基于Spring3的工程在导出runnable JAR的时候如果使用eclipse自带的插件,会出现在指定个路径中找不到applicationContext.xml 或者 applicationContext.xml无法解析的问题。
3.原因
1)找不到applicationContext.xml是由于,maven项目使用eclipse自带的插件导出可执行JAR的时候的目录结构如下图片。项目中的配置文件都被放入到了resources目录下,而从META-INF中可以看到项目的Classpath是该jar的目录,也就是图中所示目录。造成该结果的原因是使用了eclipse自带的插件导出,该工具没有将配置文件直接放入jar所在的目录。
2)无法解析applicationContext.xml是由于找不到对应的spring.schemas。虽然META-INF中有个spring.schemas,但是打开会发现里头少对beans等标签的使用描述。造成该结果是由于Spring3以后对各个功能模块进行了分包,而诸如spring-context、spring-beans、spring-aop这些模块中都可以找到一个spring.schemas,使用eclipse自带的插件导出时候只是简单的拷贝一个spring.schemas过来,具体是哪一个就需要完全由插件决定,结果不是我们需要的所有的spring.schemas的合并结果。
4.解决
使用MAVEN的插件maven-shade-plugin。配置如下:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>1.7</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <finalName>my-spring-app</finalName> <shadedArtifactAttached>true</shadedArtifactAttached> <shadedClassifierName>jar-with-dependencies</shadedClassifierName> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>net.mgorski.path.to.my.main.Clazz</mainClass> </transformer> <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> <resource>META-INF/spring.handlers</resource> </transformer> <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> <resource>META-INF/spring.schemas</resource> </transformer> <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> <resource>META-INF/spring.tooling</resource> </transformer> </transformers> </configuration> </execution> </executions> </plugin>
调用 mvn package 会导出可执行 my-spring-app.jar。该jar包中包含了所有的依赖jar和配置. 然后使用 java -jar my-spring-app.jar 运行即可。从该插件的源码中可以看到该插件对spring-context、spring-beans、spring-aop包中的spring.schemas进行了合并。
二、手工更改。
使用了eclipse自带的插件导出Runnable JAR的时候会有如下三种选择:
1.Extract required libraries into generated JAR。 ----JAR中是依赖包的class文件。
2.Package required libraries into generated JAR。 ----JAR中是依赖的jar包。
3.Copy required libraries into a sub-folder next to the generated JAR。 ---依赖放到了JAR的外部,以jar的形式。
使用第一种方式会造成上述问题。而使用第二中方式就不会出现无法解析applicationContext.xml,这是由于运行后会扫描每个依赖下的spring.schemas。这里Spring还是被放到resources目录下,这里手动调整下JAR,将resources目录下的文件拷贝到JAR的目录下即可,之所以可以这么操作是因为JAR本身只是一个文件结合,在这点上类似于zip和rar。
三、总结。
在使用maven的时候使用插件肯定最好,如果不清楚原理的话,手动操作下。
参考
1.http://mgorski.net/2013/dev/executable-jar-with-spring-based-application-inside-usin-maven
2.http://maven.apache.org/plugins/maven-shade-plugin/index.html
相关推荐
通过以上步骤,你可以在 Eclipse 中成功地将 Java 项目导出为一个可运行的 jar 文件,其中不仅可以包含 JDK 的类库,还可以包含第三方类库如 Spring 等。这种方式极大地简化了项目的部署流程,使得应用程序可以在...
这些jar包的组合表明这个项目可能涉及到Spring框架的使用,同时可能需要处理Excel数据(可能的数据导入导出或分析),可能使用SQLite或Oracle作为后端数据库,并且可能与MySQL数据库有交互。此外,项目也可能涉及XML...
当Spring Boot项目被打成jar包时,静态资源会被组织在`BOOT-INF/classes/static/`路径下,而模板文件则位于`BOOT-INF/classes/templates/`。这意味着直接通过类路径或相对路径访问这些资源可能无法成功,因为它们...
其中,Eclipse 的导出功能是一个非常有用的特性,它允许开发者将 Java 项目导出为可执行的 jar 包,以便在其他环境中运行。 在本文中,我们将详细介绍如何使用 Eclipse 将带有 main 方法的 Java 项目导出为 jar 包...
在Java开发中,导出JAR文件是一个常见的需求,特别是在创建可执行的Java应用程序时。`test.jar`可能就是一个这样的可执行JAR文件。 这篇名为“java 导出jar文件 执行批处理”的博文,虽然没有提供具体内容,但我们...
标题中的"spring开发jar包"指的是包含了Spring框架所有必要的JAR文件,这些文件被组织得井井有条,方便开发者快速集成到项目中。 描述中提到,这个压缩包包含的是Spring 3.2.8版本,这是一个相对旧的版本,适用于...
Java Spring项目是一个基于Java平台的企业级应用程序开发框架,它提供了丰富的功能来简化应用程序的构建,尤其是在服务层和表现层的集成上。Spring框架的核心特性包括依赖注入(DI)、面向切面编程(AOP)、模型-...
如果配置正确,这个JAR将是可执行的,你可以通过`java -jar your-jar-file.jar`命令来运行。 注意,`TestTest`可能指的是测试类或者测试用例,对于生产环境的可执行JAR包,通常会排除测试相关的类。如果你希望包含...
`spring-batch.jar`是Spring Batch的核心库,包含了执行批处理任务所需的所有组件。 1. **Spring Batch 概述** Spring Batch 提供了事务管理、错误处理、日志/跟踪、工作分割、步骤执行跟踪等功能,使得开发者可以...
为了在项目中使用Spring和Hibernate,开发者通常需要集成一系列的jar包来构建开发环境。以下是这些jar包及其在Spring+Hibernate开发中的作用: 1. **hibernate3.jar**:这是Hibernate的核心库,包含了对数据库操作...
综上所述,这个"spring springMvc MyBits SSM超级jar包"是一个集成多种功能的工具包,旨在帮助开发者快速搭建并运行一个具备文件上传、Ajax交互、Excel处理等功能的SSM项目。使用这个jar包,可以节省大量时间在基础...
在这个名为"SSM项目中所有的jar包"的压缩包里,包含了运行一个完整的SSM项目所需的各种依赖库。让我们深入了解一下这些jar包以及它们在SSM框架中的作用。 首先,Spring框架是Java应用程序的核心,它提供了依赖注入...
为了在Eclipse 4.9.0中使用这些jar包配置Spring项目,你需要按照以下步骤操作: 1. 创建一个新的Java项目或者选择已有的项目。 2. 在项目的“lib”目录下创建一个“libs”文件夹(如果不存在的话),将解压后的jar...
在Java编程环境中,SSH(Spring、Struts2和Hibernate)是一个常见的企业级应用框架组合,用于构建高效、灵活且可扩展的Web应用程序。在SSH框架中,有时我们需要处理数据导出的功能,例如将数据导出为Excel文件供用户...
将这个JAR添加到你的项目类路径中,就可以在代码中引入并使用ExcelUtils的相关方法了。在编写代码时,参照工具类的文档或示例,可以快速理解并掌握其使用方法。 总结来说,ExcelUtils是一个强大的Java工具,简化了...
这些jar包是SSM框架的基础,它们共同构成了SSM项目的运行环境。在实际项目中,开发者还会根据需求引入其他库,如Spring Security(安全控制)、Spring Data JPA(数据访问)、Apache Commons(各种实用工具类)等,...
2. **aspectjweaver.jar**:Spring AOP(面向切面编程)依赖于AspectJ库,该jar包用于运行时织入切面,使得可以在不修改源代码的情况下实现横切关注点,如事务管理。 3. **jasperreports-1.3.4.jar**:这是一款报告...
在这里将通过Freemarker这个模板引擎来实现导出 Word,项目不限于Swing,SSH,SSM,Spring Boot 之类的 ————————————— Spring Boot,Freemarker 编辑好格式的Word文档 1份 将Word文档里需要填充的地方...
描述中的“附整合代码和spring-osgi核心jar”意味着这个压缩包可能包含了一个示例项目的源代码以及用于OSGI和Spring整合的关键库文件——spring-osgi的核心JAR。这些JAR文件通常包含了Spring对OSGI环境的支持,比如...