从基于Spring的Java应用程序创建单个可执行JAR
我有一个基于spring的应用程序,它执行组件/包扫描,查找特定命名空间内的包。 该应用程序在Eclipse中运行完美,我想创建一个可执行的JAR来部署到我们的各种环境。
我已经尝试了各种方法来使其工作,但唯一有效的是如果我将依赖项包含在JAR之外的文件夹中。 这是我到目前为止所尝试的 –
-
Maven从这里 编译到一个jar ,使用这种方法创建单个JAR,并将依赖项作为类包含在内。 使用时运行JAR –
“java -jar jarName.jar”
我得到一个错误说明 – “错误:配置问题:无法找到XML架构命名空间的Spring NamespaceHandler http://www.springframework.org/schema/context] ”
-
使用 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] ”
-
使用 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。 它的工作原理仍然是一个谜。
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文件。