从基于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