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

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

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

> Maven从here编译到一个jar,使用这种方法创建单个JAR,并将依赖项作为类包含在内.使用时运行JAR –

“java -jar jarName.jar”

我得到一个错误说明 – “错误:配置问题:无法找到XML架构命名空间http://www.springframework.org/schema/context]的Spring NamespaceHandler”
>使用Eclipse中的Export’As Runnable JAR file’,并在Library Handling部分选择’Extract required libraries to generated JAR’.

这也构建了一个jar,其依赖关系作为其中的类.运行jar时,我得到相同的“错误:配置问题:无法找到XML架构命名空间的Spring NamespaceHandler [http://www.springframework.org/schema/context]
>使用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运行但无法扫描我要求它找到的组件.
>使用Eclipse中的Export’As Runnable JAR file’,并在Library Handling部分选择’将所需的库复制到生成的JAR旁边的子文件夹’.

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

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

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

回答:

我将以下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>
最佳答案
使用Maven Shade Plugin创建uberjar.
This也可以帮到你.

转载注明原文:从基于Spring的Java应用程序创建单个可执行JAR - 代码日志