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

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

我尝试过各种方法来实现这个功能,但唯一有效的方法是将依赖项包含在JAR之外的文件夹中。 这是我到目前为止所尝试的 -

  • Maven从这里编译到一个jar文件 ,使用这种方法创建单个JAR,并将依赖项作为类包含在内。 当使用JAR运行JAR时 -

    “java -jar jarName.jar”

    我收到一个错误,指出 - “错误:配置问题:找不到XML模式命名空间的Spring NamespaceHandler http://www.springframework.org/schema/context]”

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

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

  • 在Eclipse中使用Export'As Runnable JAR文件' ,并在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文件' ,然后在Library Handling部分中选择'将所需的库复制到生成的JAR旁边的子文件夹中'

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

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

    有没有人有关于如何构建基于Spring的应用程序对单个可运行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。 这也可以帮助你。


    我只是有和你今天一样的问题,完成相同的步骤:)

    所以谢谢你的留言,这让我节省了一些时间,而且我只想快速回答你的“为什么它的工作仍然是一个谜。” 句子:

    “这是因为我在我的依赖项中有几个Spring Jar,一些Spring Jar包含具有相同名称的元信息文件,为了避免重写某些元文件,你必须将它合并”

    所以这就是为什么你需要将这两个转换器添加到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/

    希望它有助于理解;)


    在eclipse中试试这个:在菜单中选择File - > Export - > Runnable JAR文件

    在规格窗口:(正确填充其他空白后) 库处理 :选择第二个

    完成

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

    希望能帮助到你

    链接地址: http://www.djcxy.com/p/24481.html

    上一篇: Create a single executable JAR from a Spring Based Java Application

    下一篇: Is returning uniform initialized reference valid?