【问题标题】:Manually launched Spring Boot application from .jar not working properly从 .jar 手动启动 Spring Boot 应用程序无法正常工作
【发布时间】:2024-01-23 02:23:01
【问题描述】:

问题是当我从 Intellij IDEA 运行 .jar 文件(Spring Boot MVC 应用程序)时,应用程序工作正常,但是当我尝试从命令行运行相同的文件时,模板解析器找不到模板(.html)文件。这似乎是合理的,因为当我使用文件归档器打开 .jar 时,我没有找到该文件的任何痕迹。

Intellij 如何使其正常工作?我该怎么做呢? 我的项目结构:

它们在“/templates”文件夹中

.jar 文件在归档器中打开:

正如我所说,没有.html文件,那么Intellij在运行.jar时如何添加它们?

pom.xml:

<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.vlad.pet.contactlist</groupId>
  <artifactId>web-app</artifactId>
  <version>1.0-ALPHA</version>
  <packaging>jar</packaging>

  <name>web-app</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <java.version>1.8</java.version>
  </properties>


  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.3.6.RELEASE</version>
  </parent>

  <dependencies>
    <dependency>
      <groupId>com.vlad.pet.contactlist</groupId>
      <artifactId>model</artifactId>
      <version>1.1-inmemory</version>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
    <dependency>
      <groupId>org.thymeleaf.extras</groupId>
      <artifactId>thymeleaf-extras-springsecurity4</artifactId>
      <version>2.1.2.RELEASE</version>
    </dependency>
  </dependencies>

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

【问题讨论】:

    标签: java spring-mvc intellij-idea jar spring-boot


    【解决方案1】:

    http://start.spring.io 构建的普通 Spring Boot 应用程序将在 src/main/resources 中显示模板文件夹。这是因为默认情况下,该文件夹的内容可用于类路径并打包在 jar 文件的根目录中。我猜你在 IntelliJ 中修改了项目以获取src/main/webapp 目录。不幸的是,在包装罐子时这不起作用。您需要使用 maven 资源插件来指定要包含在 jar 文件中的附加目录。

    我的建议是去 start.spring.io。选择 WebThymeleaf 作为依赖项,然后下载 zip 文件。当您查看该文件时,您将看到默认结构以及任何插件的设置以使其工作。在您的应用程序中镜像该结构。

    如果您无法更改项目结构,请查看maven-resources-plugin,了解如何添加这些目录的详细信息。

    【讨论】:

    • 好吧,似乎“Intellij 自动拾取文件”的事情仍然是个谜。但我很感谢你的帮助。在我的情况下,这个问题只是一个小技巧:在将模板移动到“资源”后,我配置了 tempateResolver 前缀,如“/templates/”,但应该:“classpath:/templates/”
    【解决方案2】:

    您可以通过在运行 app.应该有 IntelliJ 调用的完整命令。

    .jar 是如何构建的? Maven/Gradle?可能 pom/build 脚本有问题

    应该是评论,但是我的名声太低了

    【讨论】:

    • 第一行是:/usr/lib/jvm/java-8-oracle/bin/java -Dfile.encoding=UTF-8 -jar path/to/app.jar。我使用:java -jar app.jar。我敢打赌它是一样的?
    • 实际上我检查了这一行,我 90% 确定这一行更长,太长了,我无法在评论中发布这一行,所以我将使用 hastebin
    • 我检查了我的“运行”窗口,我可以说第二行和以下所有信息都是来自记录器的信息,例如:23:27:15,571 |-INFO in ch.qos.logback.classic.LoggerContext [默认] - 找不到资源 [logback.groovy] 等等@krzychek
    • 第一个可以被包装或其他东西。无论如何,我刚刚意识到这是弹簧启动,所以你可以使用:* mvn spring-boot:run 运行应用程序 * mvn spring-boot:repackage 重新打包 * mvn spring-boot:help 寻求帮助您可以像完成一样将重新打包目标添加到 pom here in example
    【解决方案3】:

    尝试使用插件生成可执行jar:

    <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <configuration>
            <executable>true</executable>
        </configuration>
        <executions>
            <execution>
                <goals>
                    <goal>repackage</goal>
                </goals>
            </execution>
        </executions>
     </plugin>
    

    构建 jar(例如 mvn clean install)后,您可以将 jar 运行为 java -jar ./target/project.jar

    【讨论】:

    • repackage 目标默认绑定到包生命周期。您不需要明确列出执行。
    最近更新 更多