java - 使用 Maven 和 Jersey/Jackson 设置生成的依赖于平台的 .war 文件?

标签 java maven tomcat jersey jackson

我正在尝试编写一个小的 REST 服务作为 Java 待办事项列表应用程序。 幸运的是,它在我的 Windows 10 环境中运行在 tomcat 上。 不幸的是,它拒绝在我的 Linux 环境中的 tomcat 上运行(请参阅下面的详细信息)。 我认为 Java 的思想是平台无关的。 问题在哪里?我做错了什么?

环境详情

在 Windows 10 专业版上工作

  • apache tomcat 8.5.4
  • jvm 1.8.0_101-b13
  • amd64架构

在 Linux Ubuntu 14.04 LTS (4.4.0-34-generic)(在 virtualbox 中)上失败

  • apache tomcat 8.5.4
  • jvm 1.8.0_101-b13
  • 采用 amd64 架构

这是我的文件的链接。很抱歉无法将其作为标记代码(markdown 或 html)发布在这里。 45 分钟后我放弃了。真丢脸。 :(

Exception report

type Exception report

message Servlet.init() for servlet todolist threw exception

description The server encountered an internal error that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: Servlet.init() for servlet todolist threw exception
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:522)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:620)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:349)
    org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:1110)
    org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:785)
    org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1425)
    org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    java.lang.Thread.run(Thread.java:745)
root cause

java.lang.NoSuchMethodError: javax.ws.rs.core.Application.getProperties()Ljava/util/Map;
    org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:331)
    org.glassfish.jersey.servlet.WebComponent.<init>(WebComponent.java:392)
    org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:177)
    org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:369)
    javax.servlet.GenericServlet.init(GenericServlet.java:158)
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:522)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:620)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:349)
    org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:1110)
    org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:785)
    org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1425)
    org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    java.lang.Thread.run(Thread.java:745)
note The full stack trace of the root cause is available in the Apache Tomcat/8.5.4 logs.

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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>de.mathema.hc2016.server</groupId>
    <artifactId>todolist</artifactId>
    <packaging>war</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>TODO List Service</name>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <repositories>
        <repository>
            <id>maven2-repository.java.net</id>
            <name>Java.net Repository for Maven</name>
            <url>http://download.java.net/maven/2/</url>
            <layout>default</layout>
        </repository>
    </repositories>

    <dependencies>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.glassfish.jersey.containers/jersey-container-servlet-core -->
        <dependency>
            <groupId>org.glassfish.jersey.containers</groupId>
            <artifactId>jersey-container-servlet</artifactId>
            <version>2.23.1</version>
        </dependency>
        <dependency>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-json</artifactId>
            <version>1.8</version>
        </dependency>
    </dependencies>

    <build>
        <finalName>todolist</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.5.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

JSONService.java

TaskSet.java

Task.java

web.xml

感谢您的帮助! :)

最佳答案

我会重新验证您的 Linux 环境。我能够在 Tomcat 8.0.x 和 8.5.4 的 Mac OS/X 和 Ubuntu 14.04 下运行您的代码。我使用了 javax.ws.rs.core.Application 配置,因为您没有包含您的 web.xml,但除此之外,它直接是您的代码。我同意@Andreas 的观点,你有一些库版本的混合,但我不知道你为什么遇到这个问题。你有没有部署到 Linux Tomcat 的其他东西?您是否对Tomcat安装下的“lib”目录等进行了修改?

关于java - 使用 Maven 和 Jersey/Jackson 设置生成的依赖于平台的 .war 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39154243/

相关文章:

java - 为什么 Java 在 Exception 和 Throwable 类中声明 serialVersionUID?

java - 使用 Maven 时 org.apache.commons 不存在

java - Maven 项目中重复的 context.xml

位于 tomcat 库中的 Java keystore

java - 在上下文 Tomcat 7 上启用自动部署

java - 如何编写单元测试(JUnit)来使用 DAO 类检查数据库连接?

java - 返回 arrayList 时遇到问题

java - ViewHolder 类中的最终属性?

maven - 如何仅将 pom 文件部署到 Maven 中的快照存储库?

spring - 将 spring mvc 项目部署到 tomcat 时,有什么方法可以自动重写 URL?