【问题标题】:spring - unable to run spring boot app on tomcatspring - 无法在 tomcat 上运行 spring boot 应用程序
【发布时间】:2018-05-13 11:40:26
【问题描述】:

我正在关注intro to rest apis with spring,但我无法让它在 tomcat 服务器上运行(尝试过 tomcat 7 和 9)。在 Eclipse 中,我运行为 -> 运行配置 -> Apache Tomcat 启动 Tomcat 时没有错误,但在浏览器中出现 404 错误(http://localhost:8080/greeting?name=Susy


编辑

尝试在项目上mvn clean install 然后java -jar project.jar 给了

Failed to load Main/Class manifest attribute from project.jar

编辑 2

我将项目导出到一个可运行的 jar 中(并将所需的库打包到生成的 jar 中)但 java -jar project.jar 给出了

java -jar restdemo.jar
Failed to instantiate SLF4J LoggerFactory
Reported exception:
java.lang.NoClassDefFoundError: ch/qos/logback/core/Context
        at org.slf4j.LoggerFactory.bind(LoggerFactory.java:150)

编辑 3

我没有删除我的 m2,因为里面有很多东西,但我现在通过 eclipse 的 spring 工具创建 spring start 项目。我添加了WebActuator 作为依赖项。当从spring.io 创建项目时,我首先注意到我的公司代理阻止获取 spring 父 pom:

Original error: Could not transfer artifact org.springframework.boot:spring-boot-starter-parent:pom:1.5.9.RELEASE from/to <company>MavenRepository (http://maven-repository.<company>.net): 
Access denied to http://maven-repository.<company>.net/org/springframework/boot/spring-boot-starter-parent/1.5.9.RELEASE/spring-boot-starter-parent-1.5.9.RELEASE.pom. 
Error code 403, URLBlocked and 'parent.relativePath' points at wrong local POM

所以我添加到我的 pom 中

    <repositories>
        <repository>
            <id>spring-releases</id>
            <url>https://repo.spring.io/libs-release</url>
        </repository>
    </repositories>

    <pluginRepositories>
        <pluginRepository>
            <id>spring-releases</id>
            <url>https://repo.spring.io/libs-release</url>
        </pluginRepository>
    </pluginRepositories>

在 maven 更新后删除错误。但是当我将应用程序作为 spring boot 应用程序运行时,我得到了这个错误

    Exception in thread "main" java.lang.IllegalArgumentException: Cannot instantiate interface org.springframework.context.ApplicationContextInitializer : org.springframework.boot.context.ConfigurationWarningsApplicationContextInitializer
    at org.springframework.boot.SpringApplication.createSpringFactoriesInstances(SpringApplication.java:413)
    at org.springframework.boot.SpringApplication.getSpringFactoriesInstances(SpringApplication.java:392)
    at org.springframework.boot.SpringApplication.getSpringFactoriesInstances(SpringApplication.java:383)
    at org.springframework.boot.SpringApplication.initialize(SpringApplication.java:249)
    at org.springframework.boot.SpringApplication.<init>(SpringApplication.java:225)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1118)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1107)
    at com.spring.rest.demo.Restdemo2Application.main(Restdemo2Application.java:10)
Caused by: java.lang.NoClassDefFoundError: org/springframework/beans/BeanUtils
    at org.springframework.boot.SpringApplication.createSpringFactoriesInstances(SpringApplication.java:409)
    ... 7 more
Caused by: java.lang.ClassNotFoundException: org.springframework.beans.BeanUtils
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 8 more

但是 spring-core 或 spring-beans 依赖都应该通过 parent 导入吧?


这是实现:

App.class

@SpringBootApplication
public class App {

    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }
}

GreetingController.java

@RestController
public class GreetingController {

    private static final String template = "Hello, %s!";
    private final AtomicLong counter = new AtomicLong();

    @RequestMapping(value="/greeting", method=RequestMethod.GET)
    public Greeting greeting(@RequestParam(value="name", required=true) String name) 
    {
        return new Greeting(counter.incrementAndGet(),
                            String.format(template, name));
    }
}

Greeting.java

public class Greeting {

    private final long id;
    private final String content;

    public Greeting(long id, String content) {
        this.id = id;
        this.content = content;
    }

    public long getId() {
        return id;
    }

    public String getContent() {
        return content;
    }
}

spring's deployment help 它说

当你运行你的应用程序时,Spring Boot 会默认检测到你有一个 Spring MVC 控制器并启动一个嵌入式 Apache Tomcat 7 实例

但是当我通过 project->run->java 应用程序运行应用程序时,我得到了

 Exception in thread "main" java.lang.NoClassDefFoundError: org/springframework/boot/SpringApplication
    at greeting.app.App.main(App.java:10)
Caused by: java.lang.ClassNotFoundException: org.springframework.boot.SpringApplication
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 1 more

这些是我的 tomcat 设置

【问题讨论】:

  • 我猜你的一个罐子坏了。你是如何创建 project.jar 的?
  • 如果您使用的是 SpringBoot,那么您需要使用嵌入式 Tomcat 服务器运行它。尝试以 Run -> Java Application 运行,它将启动嵌入式 tomcat,您的代码将部署在 tomcat 中。如果它不能像这样工作,那么粘贴你的 pom.xml,可能是一些依赖没有正确设置。

标签: java spring spring-mvc tomcat


【解决方案1】:

关于您编写​​的最后一个错误,很可能您的 Maven jar 文件中的一个已损坏,如消息所示

invalid LOC header (bad signature)

最简单的选择是删除整个 .m2 文件夹(Maven 存储其依赖项的地方)。此存储库的位置(可能被隐藏)

  • *nix/Mac ~/.m2
  • Windows C:\Documents and Settings{您的用户名}.m2

要运行 Spring Boot 项目,您通常有两个选择 使用嵌入式 Tomcat(或其他服务器)的可运行 jar,这是首选选项。在这种情况下,创建 jar 后,您可以运行它

java -jar yourjar.jar

它将作为服务器运行。 您可以通过将 pom.xml 中的打包设置为 jar 并将 spring-boot-maven-plugin 添加到您的插件中来做到这一点。 这是首选。

另一种选择是生成 .war 文件并将其部署到应用程序服务器。 在这种情况下,您将包装设置为战争。

关于这个错误

java.lang.ClassNotFoundException: org.springframework.boot.SpringApplication

似乎您没有正确指定项目的依赖项。您应该将spring-boot-starter-parent 设置为父级并添加spring-boot-starter 作为依赖项。

我建议使用https://start.spring.io/ 生成您的项目

您可以设置包装,添加Web 启动器,您就可以开始使用了 开始实现你的逻辑。它还将添加所有必要的依赖项。

【讨论】:

  • @tenticon 是的,它应该添加这些依赖项。我仍然认为您的 .m2 中有损坏的依赖项,因此它无法正常工作。当 Maven 遇到 403(有时)时,它会使用 HTML 消息写入 jar。请检查 spring-boot-starter-web 是否有效(实际上是从 .m2 文件夹中以 zip 格式打开它)。如果它无效,请删除它。还要检查 .m2 文件夹中的空罐子。运行一个 Maven 依赖树,检查依赖关系(spring-beans 和 core 是否被导入)。
猜你喜欢
  • 2016-06-20
  • 2017-05-30
  • 2017-04-19
  • 1970-01-01
  • 2018-09-04
  • 2019-03-08
  • 2020-10-03
  • 2017-12-15
  • 2015-12-30
相关资源
最近更新 更多