【问题标题】:Spring boot mac: jar not foundSpring Boot mac:找不到jar
【发布时间】:2018-08-30 01:24:15
【问题描述】:

我目前正在尝试以旧方式将 Spring Boot 应用程序容器化。我想使用 maven 命令构建我的项目,将 jar(及其依赖项)复制到容器并使用嵌入式 Tomcat 运行 Jar。

到目前为止,我已经编写了一个 maven 配置文件来编译我的代码并构建一个 jar。 jar 中包含所有依赖项 jar。完美的!

当我尝试通过 cli 手动运行 jar 时,会发生不幸的事情。 CLI 抱怨缺少依赖项 jar,但在解压缩并挖掘父 jar 本身后,情况似乎并非如此。

请允许我进一步分解:

这是我的 Maven 个人资料:

<profile>
            <id>docker</id>
            <activation>
                <activeByDefault>false</activeByDefault>
            </activation>
            <properties>
                <packaging.type>jar</packaging.type>
                <log.dir>logs</log.dir>
                <!-- updates bootstrap.properties -->
                <config.override.path>./conf</config.override.path> <!-- "file:" cannot be used with relative path (not a valid URI, y'all) -->
            </properties>
            <build>
                <plugins>
                    <plugin>
                        <artifactId>maven-assembly-plugin</artifactId>
                        <configuration>
                            <archive>
                                <manifest>
                                    <mainClass>fully.qualified.MainClass</mainClass>
                                </manifest>
                            </archive>
                            <descriptorRefs>
                                <descriptorRef>jar-with-dependencies</descriptorRef>
                            </descriptorRefs>
                        </configuration>
                    </plugin>
                </plugins>
            </build>
        </profile>

这是我用来运行构建的 Jar 的命令:

java -jar target/the-jar-1.0.0-SNAPSHOT.jar

最后,这是错误:

java.io.FileNotFoundException: target/the-jar-1.0.0-SNAPSHOT.jar!/BOOT-INF/lib/the-missing-jar-1.0.0-SNAPSHOT.jar (No such file or directory)

我解压了“the-jar”只是为了在正确的位置找到“the-missing-jar”。不仅如此,当我在 IDE (IntelliJ) 中启动父 Jar 时,它也能正常工作。

这里有什么我遗漏的吗?我应该采用不同的方法吗?我觉得我现在离退出太近了。


更新: 在几个人的推荐下,我改变了我的构建配置文件。虽然我同意这是一种更好的方法,但它并没有改变结果。在尝试执行 uber jar 时,我仍然遇到关于未找到 jar 的相同的特定错误。

<profile>
    <id>docker</id>
    <activation>
        <activeByDefault>false</activeByDefault>
    </activation>
    <properties>
        <packaging.type>jar</packaging.type>
        <log.dir>logs</log.dir>
        <!-- updates bootstrap.properties -->
        <config.override.path>./conf</config.override.path> <!-- "file:" cannot be used with relative path (not a valid URI, y'all) -->
    </properties>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</profile>

【问题讨论】:

  • 不要使用maven-assembly-plugin 使用spring-boot-maven-plugin,它可以满足您的一切需求。所以基本上你采取了错误的方法。 Spring Boot 期望类文件位于特殊目录中,您的方法将生成错误类型的文件。
  • 我在问题中添加了我的更新。这种方法并没有改变结果。还有什么我可以测试的吗?
  • 为什么spring-boot-maven-plugin 应该只是 docker 配置文件的一部分?这是我没有得到的东西,你使用 Spring Boot,因此它应该是主构建的一部分。
  • 主要是为了展示问题,没有分享我所有的pom文件。我可以确认这不是问题

标签: java spring maven docker spring-boot


【解决方案1】:

spring boot 应用无需手动打包。

您可以让spring-boot-maven-plugin 为您正确构建它。

你需要添加

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

到您的 maven 项目,您将能够通过执行以下命令正确打包“uber-jar”:

mvn package

这是 spring-boot 推荐的构建可执行 jar 的方式。

您可以找到更多详细信息,包括可运行示例in the documentation

【讨论】:

  • 感谢您提供额外信息。我在问题中添加了我的更新。这种方法并没有改变结果。启动 jar 时我还应该做些什么吗?
  • 可以尝试逐步运行示例,这样您就会发现有什么不同。
  • 是的,我有一步一步的例子工作。真正的问题是官方spring框架给出的简单示例太简单了。如果我发现任何其他内容,我会更新此内容
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-29
  • 2015-09-09
  • 2014-09-15
  • 2020-09-05
  • 2021-02-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多