一、在使用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导出可运行的jar文件,楼主自己实践后截的图,不仅只包含jdk还可以包含第三方内库比如spring
myeclipse用maven构建dubbo服务的可执行jar包,有需要的同学自行下载哦~~
在这里将通过Freemarker这个模板引擎来实现导出 Word,项目不限于Swing,SSH,SSM,Spring Boot 之类的 ————————————— Spring Boot,Freemarker 编辑好格式的Word文档 1份 将Word文档里需要填充的地方...
java(ssm、springboot)项目整合润乾报表常用的jar包。
工作需要第一次使用spring boot 开发,打jar包时先是直接导出 runnable jar ,后来发现运行不了,查了半天发现打包方式有问题,写下来与大家分享
实现功能需要的最小jar集合,其中lib文件夹是导出的jar,maven pom文件夹是maven组织的pom.xml文件。二选一。
适用于eclipse4.9.0版本的spring配置
spring boot2快速导出excel的示例源码 操作系统:windows10 JAVA jdk:1.8 开发工具:IDEA java架构:spring boot 2.1.6 gitHub:https://github.com/cn-h-jar/exportexcel 作者:jar 运行提示: 启动项目...
java打包jar方案的优缺点分析及解决方案,介绍3种打jar包的方法: 1.用Eclipse插件fat.jar对程序打包。 2.直接用Myeclipse的Export导出成jar包... 直接用Myeclipse的Export中runable jar file导出成jar包(最好就用)
Java通过IText导出word和pdf所有jar(包括spring相关jar,是我工程中所有的jar包)
jar包 和 eclipse插件(内含spring mvc,upload,jquery,ibatis,urlrewritefilter,mysql驱动包和svn,maven,easy explore,tomcat插件)
适合有spring框架的javaEE平台,出自spring的HttpInvokerServiceExporter导出器,依赖Spring.jar
在eclipse中导出为可执行的jar,无需部署到任何web容器中。直接通过bat或shell启动即可。 系统启动时自动从数据库中读取框架配置信息,job信息,调度信息注入到框架中。 本系统内嵌了jetty作为框架的web接口为本框架...
spring framework 导出资源时,apache 因为担心jia冲突,有两个jar包没带进去。 可以直接下载后导入对于文件。
easypoi功能如同名字easy,主打的功能就是容易,让一个没见接触过poi的人员 就可以方便的写出Excel导出,Excel模板导出,Excel导入,Word模板导出,PDF导出,...
excel下载:自定义sql导出excel、也可在页面展示sql结果数据 字典管理:一些常量字典的维护 个人信息修改 修改密码 头像修改 其他说明: 日志模块 sl4j日志分包:将sql日志、业务日志、异常日志进行了分离,...
springmvc jsp向java传对象 java的几种接收方式 jar包版本 例:spring-webmvc-4.2.5.RELEASE
excel导入导出源码,包含jar,是基于spring框架的,要依赖spring的jar
基于Apache CXF 3.0 Spring 4.0 Maven 3.0 构建简单Restful 接口小例子。写的不太详细,因为我也是刚开始独立构建。高手请指教 构造引导见项目内ReadMe
该资源为SSH框架整合示例(Spring、Struts2、Hibernate),里面包含源代码、jar包等,是直接从MyEclipse中导出的可正常运行的完整项目。其中另含完整开发笔记一份,为此项目搭建的开发过程笔记,可供读者开发练习...