spring - 无法在tomcat上运行spring boot app

时间:2017-11-29 17:18:56

标签: java spring spring-mvc tomcat

我正在关注intro to rest apis with spring,但我不能让它在tomcat服务器上运行(尝试过tomcat 7和9)。在日食中我做跑步 - >运行配置 - > Apache Tomcat启动tomcat没有错误,但在浏览器中我收到404错误(http://localhost:8080/greeting?name=Susy

localhost:8080/greeting?name=Susy gives 404 error

修改

尝试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的弹簧工具创建了弹簧启动项目。我添加了WebActuator作为依赖项。当项目是从spring.io创建的时候我首先注意到我的公司代理阻止获得春天的父母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 app运行时,我收到此错误

    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-bean依赖项都应该通过父权限导入?

这是实施:

spring boot app folder structure

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-&gt; run-&gt; 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设置

tomcat settings in eclipse

1 个答案:

答案 0 :(得分:0)

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

invalid LOC header (bad signature)

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

  • * nix / Mac~ / .m2
  • Windows C:\ Documents and Settings {your-username} .m2

要运行Spring Boot项目,通常有两个选项 使用带有嵌入式Tomcat(或其他服务器)的runnable 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启动器,您将会很高兴  开始实现你的逻辑。它还将添加所有必要的依赖项。