我有一个基于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部分中选择'将所需库提取到生成的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 ,然后选择'将所需的库复制到生成的JAR'旁边的子文件夹中图书馆处理部分。
这将创建一个小JAR,其旁边有一个文件夹,其中包含所有依赖项作为JAR。当我运行它时,一切正常!
因此我认为这不是我的代码的问题,包装弹簧在单个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>
答案 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)