当前位置: 首页 > 面试题库 >

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

魏煜祺
2023-03-14
问题内容

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

我尝试了各种方法来使它起作用,但是唯一起作用的是是否将依赖项包含在JAR之外的文件夹中。到目前为止,这是我尝试过的-

  1. Maven 从此处 编译为单个jar ,使用这种方法,将使用包含在类中的依赖项创建单个JAR。使用-运行JAR时

“ java –jar jarName.jar”

我收到一条错误说明-“错误:配置问题:无法为XML模式名称空间http://www.springframework.org/schema/context找到Spring
NamespaceHandler ”

  1. 使用 从Eclipse 导出“可运行的JAR文件” ,然后在“库处理”部分中选择 “将所需的库提取到生成的JAR中”

这还将构建一个jar,其中的依赖项作为其中的类。运行jar时,出现相同的“错误:配置问题:无法为XML模式名称空间找到Spring
NamespaceHandler
[http://www.springframework.org/schema/context]

  1. 使用 从Eclipse 导出“可运行的JAR文件” ,然后在“库处理”部分中选择 “将所需的库打包到生成的JAR中”

这将构建一个jar,其中的依赖项作为JAR(而不是类)。运行此JAR时,出现以下错误–

“无法搜索URL [rsrc:com / company
/]下的匹配文件,因为它与文件系统java.io.FileNotFoundException中的目录不对应:URL [rsrc:com / company
/]无法解析为绝对文件路径因为它不驻留在文件系统中:rsrc:com / company
/,位于org.springframework.util.ResourceUtils.getFile(ResourceUtils.java:210”

因此,JAR运行了,但无法扫描我要它查找的组件。

  1. 使用 从Eclipse 导出“可运行的JAR文件” ,然后在“库处理”部分中选择 “将所需的库复制到生成的JAR旁边的子文件夹中”

这将创建一个小的JAR,旁边是一个文件夹,其中包含所有依赖项(作为JAR)。当我运行此命令时,一切正常!

因此,我认为这与我的代码无关,而包装弹簧似乎在单个JAR中进行扫描就没有问题。正确吗?

有人对如何构建将包/组件扫描到单个可运行JAR中的基于spring的应用程序有任何建议吗?

回答

我将以下XML添加到我的POM文件中,并仅使用了“ mvn包”,它创建了一个有效的可执行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插件创建uberjar。 这也可以为您提供帮助。



 类似资料:
  • 问题内容: 我有一个基于Maven的Spring-WS客户端项目,我希望将其打包为一个jar。在日食中,一切正常运行。当我尝试将其打包为可执行jar时,由于Spring jar不包含在我的应用程序jar中,因此出现ClassNotFound异常。 因此,我添加了maven-shade-plugin以将我的所有依赖项都包含在应用程序jar中。当我查看我的应用程序jar时,会看到包含的所有依赖项中的所

  • 问题内容: 我已经在JCreator中编写了Java程序,一切都已完成,但是我想从中创建一个可执行文件,即,我不想通过加载Java类并编译然后执行来运行程序,而是将其作为独立的可执行文件。 最快的方法是什么? 问题答案: 你可以使用SDK附带的jar工具,并创建该程序的可执行版本。 这就是完成的方式。 我将从命令提示符中发布结果,因为它更容易,但是使用JCreator时也应如此。 首先创建你的程序

  • 问题内容: 我想从我的Python项目创建一个可执行文件。用户无需安装Python就可以下载并运行它。如果我只是分发软件包,则可以使用pip,wheel和PyPI进行构建和分发,但这需要用户具有Python并且知道如何安装软件包。我可以用什么来从Python项目构建一个自包含的可执行文件? 问题答案: 这是一些常见的。除非明确指出,否则截至我上次编辑(2020年1月)时,下面列出的所有项目都将得到

  • 问题内容: 伙计们,我的模块中有很多python代码,这些模块位于多个python软件包中,现在我需要创建一个包含所有这些文件的python可执行模块或文件,因此它将在Windows和Linux服务器上运行。有哪些可能的解决方案,以及如何解决? 问题答案: 这就是鸡蛋文件的用途。请阅读以下内容:将python库/应用程序打包为.egg文件有什么好处?

  • 问题内容: 我想创建一个jar文件来执行,该文件是使用java和clojure实现的。这是我采取的步骤。 使我的Java代码调用clojure代码 我可以生成一个具有clojure核心和我的clojure代码的jar文件(ThingOne-1.0.0-SNAPSHOT- standalone.jar),并且我还可以得到一个使用jar文件中使用clojure代码的类文件(HelloJava.clas

  • 我对NodeJS是新手。我已经执行了以下命令。1.npm安装-g创建react应用程序2。创建react应用程序我的应用程序 在执行第二个命令时,我遇到了如下错误 安装软件包。这可能需要几分钟。正在安装react、react dom和react脚本。。。 uglifyjs-webpack-plugin@0.4.6安装后E:\Projects\HighAvenue\Dashboard\dashboa