简体   繁体   English

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

[英]Platform dependent .war-file produced with maven and Jersey/Jackson setting?

I am trying to write a little REST service as a Java todolist application. 我正在尝试编写一些REST服务作为Java待办事项列表应用程序。 Fortunately it runs on tomcat in my Windows 10 environment. 幸运的是,它在我的Windows 10环境中的tomcat上运行。 Unfortunately it refuses to run on tomcat in my Linux environment (see details below). 不幸的是,它拒绝在我的Linux环境中的tomcat上运行(请参阅下面的详细信息)。 I thought the idea of Java is to be platform independant. 我认为Java的想法是与平台无关。 Where is the catch? 渔获物在哪里? What am I doing wrong? 我究竟做错了什么?

Details of environments 环境细节

Works on Windows 10 Pro 在Windows 10 Pro的工作原理

  • apache tomcat 8.5.4 Apache Tomcat 8.5.4
  • jvm 1.8.0_101-b13 JVM 1.8.0_101-b13
  • architecture amd64 架构amd64

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

  • apache tomcat 8.5.4 Apache Tomcat 8.5.4
  • jvm 1.8.0_101-b13 JVM 1.8.0_101-b13
  • with architecture amd64 架构amd64

Here are the links to my files. 这是我文件的链接。 I am sorry for not being able to post it here as marked code (markdown or html). 很抱歉无法将其作为标记的代码(markdown或html)发布到此处。 I gave up after 45 Minutes. 45分钟后我放弃了。 What a shame. 多可惜。 :( :(

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 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 JSONService.java

TaskSet.java TaskSet.java

Task.java Task.java

web.xml web.xml

Thank you for your help! 谢谢您的帮助! :) :)

I would revalidate your Linux environment. 我将重新验证您的Linux环境。 I was able to run your code under both Mac OS/X and Ubuntu 14.04 in both Tomcat 8.0.x and 8.5.4. 我能够在Tomcat 8.0.x和8.5.4的Mac OS / X和Ubuntu 14.04下运行您的代码。 I used a javax.ws.rs.core.Application configuration as you didn't include your web.xml but other than that it is your code directly. 我使用了javax.ws.rs.core.Application配置,因为您没有包含web.xml,但除此之外,它直接是您的代码。 I agree with @Andreas that you've got a bit of a mix of library versions but I don't know why you're running across this. 我同意@Andreas的观点,您有多种版本的库,但我不知道您为什么会遇到这种情况。 Do you have anything else deployed to the Linux Tomcat? 您还部署了Linux Tomcat吗? Have you made any modifications to, for example, the "lib" directory under the Tomcat installation? 您是否对Tomcat安装下的“ lib”目录进行了任何修改?

The pom marks javax.servlet as provided so your app would use the version provided by Tomcat. pom将javax.servlet标记为已提供,因此您的应用将使用Tomcat提供的版本。 Based on the Exception Report it appears Tomcat on Linux is using an older version, where the getProperties() method does not exist. 根据异常报告,Linux上的Tomcat使用的是较旧的版本,其中不存在getProperties()方法。

From the docs , the getProperties() method was added in 2.0 so Linux Tomcat is apparently using an older version. docs开始 ,在2.0中添加了getProperties()方法,因此Linux Tomcat显然使用的是旧版本。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM