【发布时间】: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 项目。我添加了Web 和Actuator 作为依赖项。当从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 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