从基于Spring的Java应用程序创建单个可执行JAR

时间:2015-01-28 13:52:37

标签: java eclipse spring maven jar

我有一个基于spring的应用程序,它执行组件/包扫描,查找某个命名空间中的包。该应用程序在Eclipse中运行完美,我想创建一个可执行的JAR来部署到我们的各种环境。

我已经尝试了各种方法来实现这一点,但唯一可行的是,如果我将依赖项包含在JAR之外的文件夹中。这是我到目前为止所尝试的内容 -

  1. Maven从here编译到单个jar ,使用此方法创建单个JAR,并将依赖项作为类包含在内。使用 -

    运行JAR时

    “java -jar jarName.jar”

    我收到错误声明 - “错误:配置问题:无法找到XML架构名称空间http://www.springframework.org/schema/context]的Spring NamespaceHandler”

  2. 使用Eclipse中的Export'As Runnable JAR file ,并在Library Handling部分中选择'将所需库提取到生成的JAR'

    这也构建了一个jar,其依赖关系作为其中的类。运行jar时,我得到相同的“错误:配置问题:无法找到XML架构命名空间的Spring NamespaceHandler [http://www.springframework.org/schema/context]

  3. 使用Eclipse中的Export'As Runnable JAR file ,并在Library Handling部分中选择'将所需的包打包到生成的JAR'

    这构建了一个jar,其中的依赖关系作为JAR(而不是类)。当我运行这个JAR时,我收到以下错误 -

    “无法在URL [rsrc:com / company /]下搜索匹配的文件,因为它与文件系统java.io.FileNotFoundException中的目录不对应:URL [rsrc:com / company /]无法解析为绝对文件路径,因为它不驻留在文件系统中:rsrc:com / company / at org.springframework.util.ResourceUtils.getFile(ResourceUtils.java:210“

    因此JAR运行但无法扫描我要求它找到的组件。

  4. 使用Eclipse中的Export'As Runnable JAR file ,然后选择'将所需的库复制到生成的JAR'旁边的子文件夹中图书馆处理部分。

    这将创建一个小JAR,其旁边有一个文件夹,其中包含所有依赖项作为JAR。当我运行它时,一切正常!

  5. 因此我认为这不是我的代码的问题,包装弹簧在单个JAR中进行扫描似乎存在问题。这是对的吗?

    有没有人对如何构建基于弹簧的应用程序进行包/组件扫描到单个可运行的JAR有任何建议?

    ANSWER

    我将以下XML添加到我的POM文件中并且只使用了“mvn package”,它创建了一个可用的单个可执行jar。它的工作原理仍然是个谜。

          <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>2.3</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <transformers>
                                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <mainClass>com.company.project.MainApp</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>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
    

4 个答案:

答案 0 :(得分:2)

使用Maven Shade Plugin创建uberjar。 This也可以帮到你。

答案 1 :(得分:2)

我遇到了与你今天完全相同的问题,并采取了完全相同的步骤:)

非常感谢您的留言,这让我节省了一些时间,此外,我只想快速回答您的问题,为什么它的工作仍然是个谜。&#34;一句话:

  

&#34;这是因为我的依赖项中有几个Spring Jar。一些   spring jar包含具有相同名称的元信息文件。避免   一些元文件被覆盖,你必须合并它#34;

因此,您需要将这两个转换器添加到Maven Shade插件文档中提供的maven片段中:

<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

来源:http://robert-reiz.com/2011/11/14/832/

希望它有助于理解;)

答案 2 :(得分:0)

在eclipse中尝试这个: 在菜单中选择文件 - &gt; 导出 - &gt; 可运行的JAR文件

在规范窗口中:(在正确填充其他空白后)库处理Select the second one

完成

现在在cmd或终端中尝试以下命令: java -jar [您的项目名称]

希望有所帮助

答案 3 :(得分:0)

您可以使用带有其他目标参数的选项1 Maven编译

mvn clean package spring-boot:repackage

它将使用Spring自动加载功能创建独立的jar文件。

enter image description here