`
kingxss
  • 浏览: 973832 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Spring项目导出可运行的JAR

阅读更多

一、在使用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

分享到:
评论
3 楼 qq_15946053 2018-11-27  
基于spring的项目要导出成jar怎么做呢用eclipse的导出可执行jar的第二选项,找不到命名空间,而且我的没有resource文件夹直接在jar根目录了https://gitee.com/huangliusong/demo2这有源码,希望您不吝赐教
2 楼 kingxss 2013-11-26  
spp_1987 写道
org.springframework.util.ResourceUtils.getFile(ResourceUtils.java:205) 楼主 ,使用第二种导出成jar ,确实没有报找不到spring配置文件,但是又来一新错误。

没有发现类似问题。请确认是否是将"resources目录下的文件拷贝到JAR的目录下",即:
JAR目录/resources/
拷贝到
JAR目录/
1 楼 spp_1987 2013-11-22  
org.springframework.util.ResourceUtils.getFile(ResourceUtils.java:205) 楼主 ,使用第二种导出成jar ,确实没有报找不到spring配置文件,但是又来一新错误。

相关推荐

    eclipse导出可运行的jar文件

    通过以上步骤,你可以在 Eclipse 中成功地将 Java 项目导出为一个可运行的 jar 文件,其中不仅可以包含 JDK 的类库,还可以包含第三方类库如 Spring 等。这种方式极大地简化了项目的部署流程,使得应用程序可以在...

    spring项目jar包2

    这些jar包的组合表明这个项目可能涉及到Spring框架的使用,同时可能需要处理Excel数据(可能的数据导入导出或分析),可能使用SQLite或Oracle作为后端数据库,并且可能与MySQL数据库有交互。此外,项目也可能涉及XML...

    Spring Boot项目打成jar包后,下载resources目录下文件为空的demo

    当Spring Boot项目被打成jar包时,静态资源会被组织在`BOOT-INF/classes/static/`路径下,而模板文件则位于`BOOT-INF/classes/templates/`。这意味着直接通过类路径或相对路径访问这些资源可能无法成功,因为它们...

    eclipse导出带有main方法的jar包.docx

    其中,Eclipse 的导出功能是一个非常有用的特性,它允许开发者将 Java 项目导出为可执行的 jar 包,以便在其他环境中运行。 在本文中,我们将详细介绍如何使用 Eclipse 将带有 main 方法的 Java 项目导出为 jar 包...

    java 导出 jar 文件 执行批处理

    在Java开发中,导出JAR文件是一个常见的需求,特别是在创建可执行的Java应用程序时。`test.jar`可能就是一个这样的可执行JAR文件。 这篇名为“java 导出jar文件 执行批处理”的博文,虽然没有提供具体内容,但我们...

    spring开发jar包

    标题中的"spring开发jar包"指的是包含了Spring框架所有必要的JAR文件,这些文件被组织得井井有条,方便开发者快速集成到项目中。 描述中提到,这个压缩包包含的是Spring 3.2.8版本,这是一个相对旧的版本,适用于...

    java spring项目所需jar

    Java Spring项目是一个基于Java平台的企业级应用程序开发框架,它提供了丰富的功能来简化应用程序的构建,尤其是在服务层和表现层的集成上。Spring框架的核心特性包括依赖注入(DI)、面向切面编程(AOP)、模型-...

    myeclipse用maven构建dubbo服务的可执行jar包

    如果配置正确,这个JAR将是可执行的,你可以通过`java -jar your-jar-file.jar`命令来运行。 注意,`TestTest`可能指的是测试类或者测试用例,对于生产环境的可执行JAR包,通常会排除测试相关的类。如果你希望包含...

    spring-batch.jar

    `spring-batch.jar`是Spring Batch的核心库,包含了执行批处理任务所需的所有组件。 1. **Spring Batch 概述** Spring Batch 提供了事务管理、错误处理、日志/跟踪、工作分割、步骤执行跟踪等功能,使得开发者可以...

    spring + hibernate 开发需要 jar包

    为了在项目中使用Spring和Hibernate,开发者通常需要集成一系列的jar包来构建开发环境。以下是这些jar包及其在Spring+Hibernate开发中的作用: 1. **hibernate3.jar**:这是Hibernate的核心库,包含了对数据库操作...

    spring springMvc MyBits SSM超级jar包

    综上所述,这个"spring springMvc MyBits SSM超级jar包"是一个集成多种功能的工具包,旨在帮助开发者快速搭建并运行一个具备文件上传、Ajax交互、Excel处理等功能的SSM项目。使用这个jar包,可以节省大量时间在基础...

    SSM项目中所有的jar包。

    在这个名为"SSM项目中所有的jar包"的压缩包里,包含了运行一个完整的SSM项目所需的各种依赖库。让我们深入了解一下这些jar包以及它们在SSM框架中的作用。 首先,Spring框架是Java应用程序的核心,它提供了依赖注入...

    eclispse4.9.0spring所需jar包.zip

    为了在Eclipse 4.9.0中使用这些jar包配置Spring项目,你需要按照以下步骤操作: 1. 创建一个新的Java项目或者选择已有的项目。 2. 在项目的“lib”目录下创建一个“libs”文件夹(如果不存在的话),将解压后的jar...

    ssh导出文件需要的jar包资源

    在Java编程环境中,SSH(Spring、Struts2和Hibernate)是一个常见的企业级应用框架组合,用于构建高效、灵活且可扩展的Web应用程序。在SSH框架中,有时我们需要处理数据导出的功能,例如将数据导出为Excel文件供用户...

    ExcelUtils按模板导出所需的JAR包

    将这个JAR添加到你的项目类路径中,就可以在代码中引入并使用ExcelUtils的相关方法了。在编写代码时,参照工具类的文档或示例,可以快速理解并掌握其使用方法。 总结来说,ExcelUtils是一个强大的Java工具,简化了...

    SSM常用jar包

    这些jar包是SSM框架的基础,它们共同构成了SSM项目的运行环境。在实际项目中,开发者还会根据需求引入其他库,如Spring Security(安全控制)、Spring Data JPA(数据访问)、Apache Commons(各种实用工具类)等,...

    spring整合hibernate的所需jar包

    2. **aspectjweaver.jar**:Spring AOP(面向切面编程)依赖于AspectJ库,该jar包用于运行时织入切面,使得可以在不修改源代码的情况下实现横切关注点,如事务管理。 3. **jasperreports-1.3.4.jar**:这是一款报告...

    Java项目中利用Freemarker模板引擎导出--生成Word文档

    在这里将通过Freemarker这个模板引擎来实现导出 Word,项目不限于Swing,SSH,SSM,Spring Boot 之类的 ————————————— Spring Boot,Freemarker 编辑好格式的Word文档 1份 将Word文档里需要填充的地方...

    Spring与OSGI整合 计算器例子(转) +附整合代码和spring-osgi核心jar

    描述中的“附整合代码和spring-osgi核心jar”意味着这个压缩包可能包含了一个示例项目的源代码以及用于OSGI和Spring整合的关键库文件——spring-osgi的核心JAR。这些JAR文件通常包含了Spring对OSGI环境的支持,比如...

Global site tag (gtag.js) - Google Analytics