【问题标题】:Java Spring boot executable JAR file not running into another machineJava Spring boot 可执行 JAR 文件未运行到另一台机器上
【发布时间】:2022-01-08 13:02:40
【问题描述】:

我正在尝试将 Java spring boot (Maven) 项目打包到 JAR 文件中。这样我就可以将该 JAR 文件放入另一台计算机并简单地运行它。该文件是在“目标”文件夹中创建的。我可以通过以下方式正常运行该项目:

java -jar target/project.jar

但每当我将 Jar 文件带到另一个地方(例如,进入另一台 PC)并尝试像这样运行时:

java -jar project.jar

它在 - localhost:8080

显示 White Label Error 404 页面

如何打包项目以作为独立 JAR 文件运行而不会出现任何此类错误?

这是我的 application.properties 文件内容:

spring.datasource.url=jdbc:mariadb://localhost:3306/sample
spring.datasource.username=root
spring.datasource.password=****

spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MariaDB103Dialect

spring.jpa.hibernate.ddl-auto=update


## MULTIPART (MultipartProperties)
# Enable multipart uploads
spring.servlet.multipart.enabled=true
# Threshold after which files are written to disk.
spring.servlet.multipart.file-size-threshold=2KB
# Max file size.
spring.servlet.multipart.max-file-size=200MB
# Max Request Size
spring.servlet.multipart.max-request-size=215MB

## File Storage Properties
# All files uploaded through the REST API will be stored in this directory
file.upload-dir=/Users/noticepush/notices

spring.mvc.view.prefix: /WEB-INF/jsp/
spring.mvc.view.suffix: .jsp

这是我的 pom.xml 内容:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.1</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.tech</groupId>
    <artifactId>StressDetection</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>
    <name>StressDetection</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>11</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.mariadb.jdbc</groupId>
            <artifactId>mariadb-java-client</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
        </dependency>
        
        <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.2</version>
    </dependency>
        
        <dependency>
   <groupId>com.squareup.okhttp3</groupId>
   <artifactId>okhttp</artifactId>
   <version>4.4.0</version>
</dependency>
        
        <dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>3.0.0</version>
</dependency>

<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger-ui</artifactId>
    <version>2.9.2</version>
</dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
    </dependencies>

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

</project>

对我有什么建议吗?
注意:请不要建议使用 WAR 包装。我正在尝试将项目作为 JAR 包分发。

【问题讨论】:

  • 您使用的 MariaDB 实例怎么样?数据库不能打包成 Java,所以你总是有外部依赖...

标签: java spring-boot maven executable-jar


【解决方案1】:

spring.datasource.url=jdbc:mariadb://localhost:3306/sample您的应用程序在某个本地数据库中有依赖项。

可能是您的计算机中存在数据库并且应用程序可以访问该数据库,因此应用程序可以正常启动和播放。

在其他计算机上,数据库可能不存在或无法从应用程序访问,因此 Spring 上下文在初始化期间失败,因此您无法访问 Web 应用程序!

如果在 cmets 中指出这不是问题,那么可能还有另一个问题。

您可以在 pom.xml 中替换以下内容

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

<build>
    <finalName>${project.artifactId}</finalName>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

所以最终的 Jar 是一个重新打包的 Fat jar,它还包含所有需要的运行时依赖项。

【讨论】:

  • 我在另一台机器上也有相同的数据库,问题是正确显示页面
  • @AbhiD。请检查编辑的答案
  • 我按照你的建议做了,替换了 pom.xml 中的那些行,得到了胖 jar。但仍然是同样的问题。每当我尝试通过将 JAR 文件移出目标文件夹来运行 JAR 文件时,都会显示白标错误页面。
  • @AbhiD。日志对此有何评论?
  • 这是我的日志跟踪 - textbin.net/bvipjzifxc
【解决方案2】:

我过去遇到过这样的错误 您遇到此错误是因为 spring boot 没有默认 webPage 出现错误的屏幕截图

要修复它,您只需在 src/main/resources/statics directory 中添加一个简单的 html 文件 (index.html)

【讨论】:

    【解决方案3】:

    问题是,当您使用 java -*.jar 部署任何 springboot 应用程序时,jsp 文件将不会出现在嵌入式 tomcat 中,并且在尝试服务请求时,您将收到 404 PAGE NOT FOUND。这是因为 jar 打包,jsp 文件没有从 WEB-INF 文件夹中复制。如果在使用 jar 作为打包时将 jsp 文件保存在 META-INF/resources 文件夹下,它应该可以工作。

    相关问题:Why does Spring boot not support jsp while it can render the page if we add proper jar reference

    【讨论】:

    • 那么将 jsp 文件保存在 META-INF/resources 文件夹中并再次构建 JAR 是否可行?我可以将 JAR 运行到另一台机器上吗?
    • META-INF/resources 文件夹在哪里?我在资源中没有 META-INF 文件夹,只有一个名为 static 的文件夹,其中包含图像、内容和脚本文件夹。
    【解决方案4】:

    在这种情况下,您可能需要配置视图解析器。通常我们将 JSP 文件放在 ${project.basedir}/main/webapp/WEB-INF/jsp/ 中。在这种情况下,您必须在 application.properties 中添加以下 2 个配置参数。

    spring.mvc.view.prefix: /WEB-INF/jsp/
    spring.mvc.view.suffix: .jsp
    

    【讨论】:

    • 那些行已经在 application.properties 中,查看我的帖子
    • 好的。一个小问题。您的逻辑是否在启动时验证“file.upload-dir”位置?你能在这里获取日志跟踪吗?
    • 这是我的日志跟踪 - textbin.net/bvipjzifxc
    • 查了一下,没有奇怪的痕迹,也没有发现任何线索。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-21
    • 1970-01-01
    • 1970-01-01
    • 2021-02-08
    • 2017-01-20
    相关资源
    最近更新 更多