私は桟橋を自分のWebアプリケーションに埋め込もうとしているので、それをjarとしてパッケージ化すると、サーバーの構成を気にすることなく、誰かがjarファイルを実行できます。ただし、突堤が私のリソースクラスにアクセスできるように、メインクラスを設定するときに問題が発生しています。私はチュートリアルを見てきましたが、彼らは私が探しているものを正確に与えていません。これが今のところです。
package pojo;
import org.Eclipse.jetty.server.Server;
import org.Eclipse.jetty.servlet.DefaultServlet;
import org.Eclipse.jetty.servlet.ServletContextHandler;
import org.Eclipse.jetty.servlet.ServletHolder;
public class Main {
public static void main(String[] args) throws Exception {
Server server = new Server(8080);
ServletContextHandler context = new ServletContextHandler(ServletContextHandler.NO_SESSIONS);
context.setContextPath("/");
ServletHolder h = new ServletHolder(new DefaultServlet());
h.setInitParameter("javax.ws.rs.Application","resources.DBCollection");
context.addServlet(h, "/*");
server.setHandler(context);
server.start();
server.join();
}
}
そして、私はそれをこのクラスにマッピングしようとしています:
package resources;
import Java.util.ArrayList;
import Java.util.List;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Request;
import javax.ws.rs.core.UriInfo;
import pojo.Party;
@Path("/parties")
public class DBCollection {
@Context
UriInfo url;
@Context
Request request;
String name;
@GET
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public List<Party> getAllParties() throws Exception
{
List<Party> list = new ArrayList<Party>();
list.addAll(DBConnection.getPartyCollection().values());
return list;
}
@GET
@Path("count")
@Produces(MediaType.TEXT_PLAIN)
public String getPartyCount() throws Exception
{
return String.valueOf(DBConnection.getPartyCollection().size());
}
@Path("{party}")
public DBResource getParty(@PathParam("party")String party)
{
return new DBResource(url,request,party);
}
}
これが私のPOMファイルです。
<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>PartyAPI</groupId>
<artifactId>PartyAPIMaven</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-Java</artifactId>
<version>5.1.6</version>
</dependency>
<dependency>
<groupId>com.codahale.metrics</groupId>
<artifactId>metrics-core</artifactId>
<version>3.0.1</version>
</dependency>
<dependency>
<groupId>com.Sun.jersey</groupId>
<artifactId>jersey-server</artifactId>
<version>1.17.1</version>
</dependency>
<dependency>
<groupId>org.Eclipse.jetty</groupId>
<artifactId>jetty-server</artifactId>
<version>9.0.0.RC0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.Eclipse.jetty</groupId>
<artifactId>jetty-servlet</artifactId>
<version>9.0.0.RC0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.Eclipse.jetty</groupId>
<artifactId>jetty-servlets</artifactId>
<version>9.0.0.RC0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.Eclipse.persistence</groupId>
<artifactId>eclipselink</artifactId>
<version>2.6.0-SNAPSHOT</version>
</dependency>
</dependencies>
<repositories>
<repository>
<id>oss.sonatype.org</id>
<name>OSS Sonatype Staging</name>
<url>https://oss.sonatype.org/content/groups/staging</url>
</repository>
</repositories>
<build>
<plugins>
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>1.6</version>
<configuration>
<createDependencyReducedPom>true</createDependencyReducedPom>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer
implementation="org.Apache.maven.plugins.shade.resource.ServicesResourceTransformer" />
<transformer
implementation="org.Apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<manifestEntries>
<Main-Class>com.resteasy.Star.Main</Main-Class>
</manifestEntries>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
いくつかのこと。
あなたの例では、静的ファイルを提供するためにDefaultServlet
を設定しただけで、DBCollection
オブジェクトを使用するように構成されていません。
ジャージーの場合、org.glassfish.jersey.servlet.ServletContainer
を構成し、選択したコンテキストでサーブレットマッピングをセットアップする必要があります。
例:
package com.example;
import org.Eclipse.jetty.server.Server;
import org.Eclipse.jetty.servlet.DefaultServlet;
import org.Eclipse.jetty.servlet.ServletContextHandler;
import org.Eclipse.jetty.servlet.ServletHolder;
public class Main
{
public static void main(String[] args)
{
Server server = new Server(8080);
ServletContextHandler context = new ServletContextHandler(ServletContextHandler.NO_SESSIONS);
context.setContextPath("/");
server.setHandler(context);
ServletHolder jerseyServlet = context.addServlet(org.glassfish.jersey.servlet.ServletContainer.class, "/webapi/*");
jerseyServlet.setInitOrder(1);
jerseyServlet.setInitParameter("jersey.config.server.provider.packages","com.example");
ServletHolder staticServlet = context.addServlet(DefaultServlet.class,"/*");
staticServlet.setInitParameter("resourceBase","src/main/webapp");
staticServlet.setInitParameter("pathInfoOnly","true");
try
{
server.start();
server.join();
}
catch (Throwable t)
{
t.printStackTrace(System.err);
}
}
}
この例では、jerseyが提供するServletContainerを、Jettyが受信リクエストに基づいて何をするかを検索するために使用するServletContextHandlerに追加します。次に、DefaultServletを追加して、Jerseyが処理しないコンテンツ(静的コンテンツなど)のリクエストを処理します。
Jerseyにインスタンスを作成させる代わりに、プログラムでDBCollection
リソースのライフサイクルをプログラムで完全に管理したい場合(たとえば、自分でインスタンス化したり、セットアップ/初期化を行ったりなど)は、ResourceConfig
のような:
_ServletContextHandler sch = new ServletContextHandler();
sch.setContextPath("/xxx");
TheResource resource = new TheResource();
ResourceConfig rc = new ResourceConfig();
rc.register(resource);
ServletContainer sc = new ServletContainer(rc);
ServletHolder holder = new ServletHolder(sc);
sch.addServlet(holder, "/*");
Server server = new Server(port);
server.setHandler(sch);
server.start();
server.join();
_
行TheResource resource = new TheResource();
に注意してください。ここで、TheResourceの独自のインスタンスを作成し、自由に操作できるようになりました。