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

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

我已经尝试了各种方法来使其工作,但唯一有效的是如果我将依赖项包含在JAR之外的文件夹中。 这是我到目前为止所尝试的 –

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

    “java -jar jarName.jar”

    我得到一个错误说明 – “错误:配置问题:无法找到XML架构命名空间的Spring NamespaceHandler http://www.springframework.org/schema/context] ”

  2. 使用 Eclipse中的Export’As Runnable JAR file’ ,并在Library Handling部分选择‘Extracted required libraries to generated 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’ ,并在Library Handling部分选择‘将所需的库复制到生成的JAR旁边的子文件夹’

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

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

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

答案

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

 org.apache.maven.plugins maven-shade-plugin 2.3   package  shade     com.company.project.MainApp   META-INF/spring.handlers   META-INF/spring.schemas       

使用Maven Shade插件创建uberjar。 这也可以帮到你。

我只是遇到了与你今天相同的问题,做了完全相同的步骤:)

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

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

所以这就是为什么你需要将这两个变换器添加到Maven Shade Plugin文档中的maven片段中的原因:

 META-INF/spring.handlers  META-INF/spring.schemas  

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

希望它有助于理解;)

在eclipse中尝试这个:在菜单中选择File – > Export – > Runnable JAR file

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

完成

现在在cmd或终端中尝试以下命令: java -jar [your project’s name]

希望能帮助到你

您可以将选项1 Maven Compile用于具有其他目标参数的单个jar

 mvn clean package spring-boot:repackage 

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

在此处输入图像描述