java - 启动 HTTP 服务器时未找到 Jersey ResourceConfig

标签 java rest jersey jax-rs

我已经编写了一些服务来通过 REST 提供 latex 文档的编译,但现在它已经完成了,我陷入了困境。 :/

在开发它时,我使用 TestNG 和 RestAssured 对其进行了测试,它的工作方式非常神奇,但现在我尝试单独运行它。我不太确定问题出在哪里,所以我尝试粘贴所有重要的内容并进行一些解释。

问题是,当我让服务器在主方法中单独运行时,会出现以下异常。 (额外问题:我什至可以以这种方式运行它,或者如果必须将其部署在应用程序服务器上作为 war,它也可以从命令行作为 jar 运行,只需使用 java -jar x.jar 调用它吗?)

控制台输出

JAVA_HOME=/usr/lib/jvm/java-7-oracle /usr/local/netbeans-7.4/java/maven/bin/mvn "-Dexec.args=-classpath %classpath de.uniluebeck.compilatex.RestServer" -Dexec.executable=java -Dexec.classpathScope=runtime org.codehaus.mojo:exec-maven-plugin:1.2.1:exec
Running NetBeans Compile On Save execution. Phase execution is skipped and output directories of dependency projects (with Compile on Save turned on) will be used instead of their jar artifacts.

--- exec-maven-plugin:1.2.1:exec (default-cli) @ CompiLaTex ---
Exception in thread "main" java.lang.NoClassDefFoundError: org/glassfish/jersey/server/ResourceConfig
        at de.uniluebeck.compilatex.RestServer.<init>(RestServer.java:31)
        at de.uniluebeck.compilatex.RestServer.main(RestServer.java:42)
Caused by: java.lang.ClassNotFoundException: org.glassfish.jersey.server.ResourceConfig
        at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
        ... 2 more

这就是服务器实例化的类的样子:

RestServer.java

public class RestServer {

    static final URI BASE_URI = URI.create("http://localhost:8080/");
    final HttpServer httpServer;

    public RestServer() {
        final ResourceConfig resourceConfig = new ResourceConfig(JobService.class, JobFileService.class, LatexEnvironmentService.class, MultiPartFeature.class);
        httpServer = GrizzlyHttpServerFactory.createHttpServer(BASE_URI, resourceConfig);
        System.out.println(String.format("Jersey app started with WADL available at %sapplication.wadl\nTry out %sjobs or %slatex/environments",
                BASE_URI, BASE_URI, BASE_URI));
    }

    public void shutdown() {
        httpServer.shutdownNow();
    }

    public static void main (String[] args){
        RestServer restServer = new RestServer();
        try {
            System.in.read();
        } catch (IOException ex) {
            Logger.getLogger(RestServer.class.getName()).log(Level.SEVERE, null, ex);
        }
        restServer.shutdown();
    }
}

我只是在闲逛,但也许有一个问题,我只使用注释而没有实际的 web.xml?

JobService.java

@Path("/jobs")
public class JobService {

    private final RequestHandler requestHandler = new RequestHandler();

    @POST
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
    public Response createJob() {
        return requestHandler.handleCreateJob();
    }

    @GET
    @Path("{jobId}/compile/{latexEnvironment}")
    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
    @Produces(MediaType.APPLICATION_JSON)
    public Response compile(@PathParam("jobId") final Long jobId, @PathParam("latexEnvironment") final String latexEnvironment){ //, @Suspended final AsyncResponse asyncResponse) {
        return requestHandler.handleCompile(jobId, latexEnvironment);
    }

这就是 pom.xml 的样子:

<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>de.uniluebeck</groupId>
    <artifactId>CompiLaTex</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>

    <name>CompiLaTex</name>

    <properties>
        <endorsed.dir>${project.build.directory}/endorsed</endorsed.dir>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
       <dependency>
            <groupId>com.jayway.restassured</groupId>
            <artifactId>rest-assured</artifactId>
            <version>2.3.0</version>
            <exclusions>
                <!-- Exclude Groovy because of classpath issue -->
                <exclusion>
                    <groupId>org.codehaus.groovy</groupId>
                    <artifactId>groovy</artifactId>
                </exclusion>
            </exclusions>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.codehaus.groovy</groupId>
            <artifactId>groovy-all</artifactId>
            <!-- Needs to be the same version that REST Assured depends on -->
            <version>2.2.1</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.testng</groupId>
            <artifactId>testng</artifactId>
            <version>6.8.1</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>javax.ws.rs</groupId>
            <artifactId>javax.ws.rs-api</artifactId>
            <version>2.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-multipart</artifactId>
            <version>2.6</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.containers</groupId>
            <artifactId>jersey-container-grizzly2-http</artifactId>
            <version>2.6</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-moxy</artifactId>
            <version>2.6</version>
        </dependency>
        <dependency>
            <groupId>org.apache.derby</groupId>
            <artifactId>derbyclient</artifactId>
            <version>10.10.1.1</version>
        </dependency>
        <dependency>
            <groupId>org.eclipse.persistence</groupId>
            <artifactId>eclipselink</artifactId>
            <version>2.5.1</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.eclipse.persistence</groupId>
            <artifactId>org.eclipse.persistence.jpa.modelgen.processor</artifactId>
            <version>2.5.1</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-web-api</artifactId>
            <version>7.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.3</version>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-exec</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.4</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.gmbal</groupId>
            <artifactId>gmbal</artifactId>
            <version>4.0.0-b001</version>
        </dependency>
        <dependency>
            <groupId>org.codehaus.enunciate</groupId>
            <artifactId>enunciate-core</artifactId>
            <version>1.28</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                    <compilerArguments>
                        <endorseddirs>${endorsed.dir}</endorseddirs>
                    </compilerArguments>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>2.4</version>
                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <mainClass>de.uniluebeck.compilatex.RestServer</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.3</version>
                <configuration>
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>2.6</version>
                <executions>
                    <execution>
                        <phase>validate</phase>
                        <goals>
                            <goal>copy</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${endorsed.dir}</outputDirectory>
                            <silent>true</silent>
                            <artifactItems>
                                <artifactItem>
                                    <groupId>javax</groupId>
                                    <artifactId>javaee-endorsed-api</artifactId>
                                    <version>7.0</version>
                                    <type>jar</type>
                                </artifactItem>
                            </artifactItems>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
    <repositories>
        <repository>
            <url>http://download.eclipse.org/rt/eclipselink/maven.repo/</url>
            <id>eclipselink</id>
            <layout>default</layout>
            <name>Repository for library EclipseLink (JPA 2.1)</name>
        </repository>
    </repositories>
</project>

我很高兴有人看到这个问题并大肆讨论,谢谢大家! (也感谢任何提示或其他主题的链接,部署此类东西的正确做法是什么。)

最佳答案

感谢 @andrei-i 让我走上了正确的道路,我发现所有 Jersey 依赖项的范围都是错误的。设置为假设它们必须在测试时存在,但在运行时不存在。我只是删除了所有这些范围,它就起作用了。天哪!

关于java - 启动 HTTP 服务器时未找到 Jersey ResourceConfig,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22941330/

相关文章:

angularjs - JSON-LD+Hydra 链接发现

java - 如何在特定 JAX - RS 调用上排除对象内的字段?

java - HBase 分区域负载均衡

java - 在 Java 中循环 MIDI 序列

java - 如何将 REST Web 服务部署到 AWS?

java - Spring Boot REST API 的 @PutMapping 和 @DeleteMapping 的 HTTP 状态?

java - 使用 Jackson 验证列表元素

java - jax-rs 在 ContainerRequestFilter 和 ReaderInterceptor 之间共享信息

java - 为什么 Cobertura 在通过 Eclipse 插件运行时报告覆盖率为 0%?

java - 使用 Firebase 检查整个 JSON 文件中是否存在数字