开发RESTful Web服务,没有一个好的工具包很难在客户机-服务器的抽象的底层细节中无缝的支持你各种各样的媒体类型数据。为了简化java开发RESTful web服务和客户端,设计了JAX-RS API。Jersey RESTful Web 服务是开源的产品级的框架,该框架实现了JAX-RS(JSR 311 & JSR 339)标准并支持使用JAX-RS API 进行开发RESTful Web服务。
Jersey框架不仅仅是JAX-RS的实现。Jersey提供了自己的API扩展了JAX-RS工具包和附加服务,进一步简化了RESTful Web 服务和客户端开发。Jersey同时也扩展了很多SPIs 因此开发者可以根据自己的需求对Jersey进行二次开发。
Jersey项目目标可以归结为以下几点:
-遵循JAX-RS API 和提供定期发布的产品可参考实现发布在GlassFish上的ships
-提供APIs来扩展Jersey & 最后建立一个用户和开发者的社区。
-让使用java和JVM来建立RESTful Web服务变得更加简单
第1章。开始
1.1。创建一个新项目从Maven原型
1.2。探索新创建的项目
1.3。运行该项目
1.4。创建一个JavaEE Web应用程序
1.5。创建一个Web应用程序,它可以部署在Heroku
1.5.1。部署在Heroku
1.6。探索其他球衣的例子
本章简单介绍如何使用Jersey构建基于RESTful 的服务。这里描述的示例使用了轻量级的Grizzly HTTP服务器。本章结束时,您将实现一个等同于可以部署在任何servlet容器(支持servlet 2.5或更高版本)的JavaEE web应用程序
1.1。使用Maven创建一个新项目
Jersey项目使用Apache Maven软件项目构建和管理工具。所有Jersey项目产生的模块在构建的时候将被推到Maven的中央仓库。因此所有的MAVEN-bases项目使用Jersey发布非常方便,Jersey的依赖是现成的不需要配置特殊的Maven仓库来存储使用的Jersey模块
请注意
如果您想依赖最新的快照版本的Jersey模块,下面的存储库配置需要添加到您的Maven项目的 pom中:
<repository>
<id>snapshot-repository.java.netid>
<name>Java.net Snapshot Repository for Mavenname>
<url>https://maven.java.net/content/repositories/snapshots/url>
<layout>defaultlayout>
repository>
由于从一个Maven项目开始使用Jersey是最方便的方式,现在让我们看看这种方法。现在我们将创建一个新的运行在Grizzly容器上的Jersey项目。我们将使用 Jersey-provided maven archetype原型。创建项目,执行以下Maven命令在新项目的所在目录:
mvn archetype:generate -DarchetypeArtifactId=jersey-quickstart-grizzly2 \
-DarchetypeGroupId=org.glassfish.jersey.archetypes -DinteractiveMode=false \
-DgroupId=com.example -DartifactId=simple-service -Dpackage=com.example \
-DarchetypeVersion=2.25.1
随时调整你的新项目的groupId, package 或者 artifactId。或者,你可以通过更新你新项目的pom.xml来改变它,需要重新构建后将起效。
1.2。探索新创建的项目
一旦项目依据Jersey maven原型创建成功完成后,您将看到在你当前目录下生成新 simple-service项目目录。目录包含一个标准的Maven项目结构:
项目根目录下的pom.xml文件中描述了项目构建和管理配置
项目源码位于 src/main/java目录下.
项目测试源码位于 src/test/java目录下.
在项目源目录下的com.example包中有2个类。Main类负责引导Grizzly容器也负责配置和部署项目的JAX-RS应用到Grizzly容器中。另一个MyResource类,包含了一个简单的jax-rs资源的额实现,下面是源码:
package com.example;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
/**
* Root resource (exposed at "myresource" path)
*/
@Path("myresource")
public class MyResource {
/**
* Method handling HTTP GET requests. The returned object will be sent
* to the client as "text/plain" media type.
*
* @return String that will be returned as a text/plain response.
*/
@GET
@Produces(MediaType.TEXT_PLAIN)
public String getIt() {
return "Got it!";
}
}
一个JAX-RS资源是一个注解组件类(POJO),提供的资源方法能够处理来自绑定到资源的URI路径的HTTP请求。看到第三章,jax - rs应用程序、资源和子资源是jax - rs资源完全指南。在我们的例子中,资源公开一个资源方法用来处理HTTP GET请求,该方法绑定了 /myresource URI路径并且可以根据Request请求信息内容产生 “text/plain”媒体类型的response相应。在这个版本中,资源对所有的客户端的返回是一样的 -“Got it!”。
最后一段代码的是这个简单的项目的单元测试类- MyResourceTest,这个类测试的是com.example包中的MyResource类。但是,这测试类放入到maven项目测试源目录 src/test/java下(某些代码注释和JUnit进口已经排除了简洁):
package com.example;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.WebTarget;
import org.glassfish.grizzly.http.server.HttpServer;
...
public class MyResourceTest {
private HttpServer server;
private WebTarget target;
@Before
public void setUp() throws Exception {
server = Main.startServer();
Client c = ClientBuilder.newClient();
target = c.target(Main.BASE_URI);
}
@After
public void tearDown() throws Exception {
server.stop();
}
/**
* Test to see that the message "Got it!" is sent in the response.
*/
@Test
public void testGetIt() {
String responseMsg = target.path("myresource").request().get(String.class);
assertEquals("Got it!", responseMsg);
}
}
在这个单元测试中,Grizzly容器第一个被启动和服务器应用程序部署在test setUp()由静态方法Main.startServer()调用。接下来,在同一个测试启动方法种创建一个jax - rs客户端组件。首先创建一个新的jax - rs客户端实例 c 然后建立一个jax - rs web目标组件指向我们部署在http://localhost:8080/myapp/上的应用程序的上下文根 (一个值 Main.BASE_URI存储在一个常数) target单元测试类的字段。然后使用这个领域在实际的单元测试方法(testGetIt()).
在 testGetIt()方法中一个jax - rs客户端API向监听 /myresourceURI 的MyResource jax - rs资源类的连接并发送一个HTTP GET请求 。相同的有一个jax - rs API方法调用链,读取Java String类型response 响应。在测试方法的第二行,对从服务器返回的响应内容字符串和预期字符串进行断言对比。更多地了解使用jax - rs客户端API,请参阅第五章,客户端API一章。
1.3。运行该项目
现在我们已经看过项目的内容,让我们试着一起测试。要做到这一点,我们需要在命令界面调用下面的命令:
mvn clean test
这将编译并运行项目的单元测试。一旦构建完成,如果构建成功的话我们将看到一个简短的输出:
Results :
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 34.527s
[INFO] Finished at: Sun May 26 19:26:24 CEST 2013
[INFO] Final Memory: 17M/490M
[INFO] ------------------------------------------------------------------------
既然我们已经证实该项目编译单元测试通过,我们可以独立执行这个应用程序了。以下是maven命令:
mvn exec:java
应用程序开始和你在控制台很快就会看到以下通知:
May 26, 2013 8:08:45 PM org.glassfish.grizzly.http.server.NetworkListener start
INFO: Started listener bound to [localhost:8080]
May 26, 2013 8:08:45 PM org.glassfish.grizzly.http.server.HttpServer start
INFO: [HttpServer] Started.
Jersey app started with WADL available at http://localhost:8080/myapp/application.wadl
Hit enter to stop it...
这个通知您应用程序已经启动,WADL描述符http://localhost:8080/myapp/application.wadl是可用的 URL。你可以通过在你的浏览器上输入WADL URL进行检索,也可以在您的控制执行crul命令检索WADL内容。你讲获取到一个WADL格式的xml文档,该文档用来描述您部署的RESTful 应用。更多地了解使用WADL,检查17章,WADL支持。
结束前的最后一件事,我们来看看,我们是否可以与我们部署在/myresource路径下的资源进行交互。我们可以再次在浏览器中输入资源URL,或者使用 curl命令:
$ curl http://localhost:8080/myapp/myresource
Got it!
我们可以看到, curl命令返回的 Got it!信息,该信息是我们的资源进行返回的。我们也可以通过配合crul命令来获取更多的响应信息。例如我们可以让它显示所有响应头通过使用 -i指令:
curl -i http://localhost:8080/myapp/myresource
HTTP/1.1 200 OK
Content-Type: text/plain
Date: Sun, 26 May 2013 18:27:19 GMT
Content-Length: 7
Got it!
在这里,我们看到了Jersey/jax-rs应用程序返回的完整的响应消息,包括我们的HTTP响应头。注意 http头信息中 Content-Type: text/plain是来自我们MyResource类附加的 @Produces 注释。
如果您想看我们的crul客户和部署在Grizzly I/O容器上Jersey应用之间的交互的更多信息,请尝试其他各种curl提供的选项和配置 。例如,这最后一个命令 curl,这个命令将输出很多关于整个通信的额外信息:
$ curl -v http://localhost:8080/myapp/myresource
* About to connect() to localhost port 8080 (#0)
* Trying ::1...
* Connection refused
* Trying 127.0.0.1...
* connected
* Connected to localhost (127.0.0.1) port 8080 (#0)
> GET /myapp/myresource HTTP/1.1
> User-Agent: curl/7.25.0 (x86_64-apple-darwin11.3.0) libcurl/7.25.0 OpenSSL/1.0.1e zlib/1.2.7 libidn/1.22
> Host: localhost:8080
> Accept: */*
>
< HTTP/1.1 200 OK
< Content-Type: text/plain
< Date: Sun, 26 May 2013 18:29:18 GMT
< Content-Length: 7
<
* Connection #0 to host localhost left intact
Got it!* Closing connection #0
1.4。创建一个JavaEE Web应用程序
创建一个Web应用程序,可以打war包和部署在一个Servlet容器中,以上所描述的类似1.1节,“创建一个新项目从Maven原型”。除了Grizzly-based原型,Jersey也提供了一个Maven原型创建的web应用程序框架。创建新的web应用程序框架项目,执行以下Maven命令:
mvn archetype:generate -DarchetypeArtifactId=jersey-quickstart-webapp \
-DarchetypeGroupId=org.glassfish.jersey.archetypes -DinteractiveMode=false \
-DgroupId=com.example -DartifactId=simple-service-webapp -Dpackage=com.example \
-DarchetypeVersion=2.25.1
与Grizzly based project项目一样,随时调整你新项目的 groupId, package或者 artifactId。或者,你可以通过改变项目的pom.xml文件来改变配置。
一旦项目从Jersey maven原型创建成功完成后,您应该在你的项目目录下看到新 simple-service-webapp项目。目录包含一个标准的Maven项目结构,类似于我们之前的 simple-service项目内容,除了一个web项目的额外扩展,web应用程序的具体内容:
项目构建和管理配置中描述 pom.xml位于项目根目录。
项目来源所在 src/main/java.
项目资源位于下 src/main/resources.
项目坐落在web应用程序文件 src/main/webapp.
项目包含相同的 MyResouce jax - rs资源类。它不包含任何单元测试,因为它不包含 Main容器类,用于在项目启动前配置Grizzly 容器。相反,它包含了标准的Java EE web应用程序 的web.xml在 src/main/webapp/WEB-INF目录下。在项目的最后一个组件是一个 index.jsp作为客户的页面来放我们部署的应用的MyResource资源类包。
编译和打包应用程序的war包,在您的控制台调用以下maven命令:
mvn clean package
成功构建的输出会产生一个输出信息,类似下图:
Results :
Tests run: 0, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO] --- maven-war-plugin:2.1.1:war (default-war) @ simple-service-webapp ---
[INFO] Packaging webapp
[INFO] Assembling webapp [simple-service-webapp] in [.../simple-service-webapp/target/simple-service-webapp]
[INFO] Processing war project
[INFO] Copying webapp resources [.../simple-service-webapp/src/main/webapp]
[INFO] Webapp assembled in [75 msecs]
[INFO] Building war: .../simple-service-webapp/target/simple-service-webapp.war
[INFO] WEB-INF/web.xml already added, skipping
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 9.067s
[INFO] Finished at: Sun May 26 21:07:44 CEST 2013
[INFO] Final Memory: 17M/490M
[INFO] ------------------------------------------------------------------------
现在,您准备好了一个war包(目录位于./target/simple-service-webapp.war),然后将其部署到选择好的Servlet容器中。
重点
部署一个Jersey的应用程序,您将需要一个支持Servlet 2.5或更高版本的Servlet容器。全套的高级特性(例如jax - rs 2.0异步支持)你需要一个Servlet 3.0或更高版本兼容的容器。
1.5。创建一个Web应用程序,它可以部署在Heroku
创建一个Web应用程序,可以打war包和部署在一个Servlet容器,或者可以推送和部署在Heroku容器,该过程和1.4节,“创建一个JavaEE Web应用程序”非常相似。创建新的web应用程序框架项目,执行以下Maven命令:
mvn archetype:generate -DarchetypeArtifactId=jersey-heroku-webapp \
-DarchetypeGroupId=org.glassfish.jersey.archetypes -DinteractiveMode=false \
-DgroupId=com.example -DartifactId=simple-heroku-webapp -Dpackage=com.example \
-DarchetypeVersion=2.25.1
根据需求调整 groupId, package和 artifactId,或者直接修改pom.xml文件。
项目通过Jersey maven archetype 原型创建成果后,你可以在创建项目的位置看到一个simple-heroku-webapp项目。项目中包含了一个标准的Maven目录结构:
项目构建和管理配置pom.xml文件位于项目根目录。
项目源码目录:src/main/java.
项目资源位目录: src/main/resources.
项目web应用程序文件 目录:src/main/webapp.
项目测试源(基于JerseyTest)目录: src/test/java.
Heroku系统属性(OpenJDK版)定义文件 system.properties.
Heroku的过程类型在一个应用程序列表 Procfile.
这个项目包含一个jax - rs资源类 MyResouce,一个资源方法,返回简单的文本消息。确保资源是正确的,还有一个端到端测试用例 MyResourceTest(测试是基于JerseyTest从我们的26章,Jersey测试框架)。类似于 simple-service-webapp,项目包含标准的Java EE web应用程序 web.xml部署描述符下 src/main/webapp/WEB-INF因为我们的目标是一个Servlet容器中部署应用程序(应用程序将运行在Jetty Heroku)。
编译和打包的应用程序到war包,在您的控制台调用以下maven命令:
mvn clean package
成功构建的输出会产生一个输出类似下图:
Results :
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO] --- maven-war-plugin:2.2:war (default-war) @ simple-heroku-webapp ---
[INFO] Packaging webapp
[INFO] Assembling webapp [simple-heroku-webapp] in [.../simple-heroku-webapp/target/simple-heroku-webapp]
[INFO] Processing war project
[INFO] Copying webapp resources [.../simple-heroku-webapp/src/main/webapp]
[INFO] Webapp assembled in [57 msecs]
[INFO] Building war: .../simple-heroku-webapp/target/simple-heroku-webapp.war
[INFO] WEB-INF/web.xml already added, skipping
[INFO]
[INFO] --- maven-dependency-plugin:2.8:copy-dependencies (copy-dependencies) @ simple-heroku-webapp ---
[INFO] Copying hk2-locator-2.2.0-b21.jar to .../simple-heroku-webapp/target/dependency/hk2-locator-2.2.0-b21.jar
[INFO] Copying jetty-security-9.0.6.v20130930.jar to .../simple-heroku-webapp/target/dependency/jetty-security-9.0.6.v20130930.jar
[INFO] Copying asm-all-repackaged-2.2.0-b21.jar to .../simple-heroku-webapp/target/dependency/asm-all-repackaged-2.2.0-b21.jar
[INFO] Copying jersey-common-2.5.jar to .../simple-heroku-webapp/target/dependency/jersey-common-2.5.jar
[INFO] Copying validation-api-1.1.0.Final.jar to .../simple-heroku-webapp/target/dependency/validation-api-1.1.0.Final.jar
[INFO] Copying jetty-webapp-9.0.6.v20130930.jar to .../simple-heroku-webapp/target/dependency/jetty-webapp-9.0.6.v20130930.jar
[INFO] Copying jersey-container-servlet-2.5.jar to .../simple-heroku-webapp/target/dependency/jersey-container-servlet-2.5.jar
[INFO] Copying cglib-2.2.0-b21.jar to .../simple-heroku-webapp/target/dependency/cglib-2.2.0-b21.jar
[INFO] Copying osgi-resource-locator-1.0.1.jar to .../simple-heroku-webapp/target/dependency/osgi-resource-locator-1.0.1.jar
[INFO] Copying hk2-utils-2.2.0-b21.jar to .../simple-heroku-webapp/target/dependency/hk2-utils-2.2.0-b21.jar
[INFO] Copying hk2-api-2.2.0-b21.jar to .../simple-heroku-webapp/target/dependency/hk2-api-2.2.0-b21.jar
[INFO] Copying jetty-io-9.0.6.v20130930.jar to .../simple-heroku-webapp/target/dependency/jetty-io-9.0.6.v20130930.jar
[INFO] Copying jetty-server-9.0.6.v20130930.jar to .../simple-heroku-webapp/target/dependency/jetty-server-9.0.6.v20130930.jar
[INFO] Copying jetty-util-9.0.6.v20130930.jar to .../simple-heroku-webapp/target/dependency/jetty-util-9.0.6.v20130930.jar
[INFO] Copying jersey-client-2.5.jar to .../simple-heroku-webapp/target/dependency/jersey-client-2.5.jar
[INFO] Copying jetty-http-9.0.6.v20130930.jar to .../simple-heroku-webapp/target/dependency/jetty-http-9.0.6.v20130930.jar
[INFO] Copying guava-14.0.1.jar to .../simple-heroku-webapp/target/dependency/guava-14.0.1.jar
[INFO] Copying jetty-xml-9.0.6.v20130930.jar to .../simple-heroku-webapp/target/dependency/jetty-xml-9.0.6.v20130930.jar
[INFO] Copying jersey-server-2.5.jar to .../simple-heroku-webapp/target/dependency/jersey-server-2.5.jar
[INFO] Copying jersey-container-servlet-core-2.5.jar to .../simple-heroku-webapp/target/dependency/jersey-container-servlet-core-2.5.jar
[INFO] Copying javax.ws.rs-api-2.0.jar to .../simple-heroku-webapp/target/dependency/javax.ws.rs-api-2.0.jar
[INFO] Copying jetty-servlet-9.0.6.v20130930.jar to .../simple-heroku-webapp/target/dependency/jetty-servlet-9.0.6.v20130930.jar
[INFO] Copying javax.inject-2.2.0-b21.jar to .../simple-heroku-webapp/target/dependency/javax.inject-2.2.0-b21.jar
[INFO] Copying javax.servlet-3.0.0.v201112011016.jar to .../simple-heroku-webapp/target/dependency/javax.servlet-3.0.0.v201112011016.jar
[INFO] Copying javax.annotation-api-1.2.jar to .../simple-heroku-webapp/target/dependency/javax.annotation-api-1.2.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 4.401s
[INFO] Finished at: Mon Dec 09 20:19:06 CET 2013
[INFO] Final Memory: 20M/246M
[INFO] ------------------------------------------------------------------------
现在你知道一切如预期你准备:
在您的项目中做出一些改变,
把war包装( ./target/simple-service-webapp.war)并将其部署到Servlet容器的选择,或
1.5.1部分,“Heroku部署它”
提示
如果你想做一些更改您的应用程序可以通过简单地运行在本地运行应用程序 mvn clean package jetty:run(启动嵌入式Jetty服务器)或通过 java -cp target/classes:target/dependency/* com.example.heroku.Main(这是如何开始Heroku Jetty)。
1.5.1。部署在Heroku
我们不会详细如何创建一个帐户Heroku和设置的 Heroku工具在您的机器上。你可以找到大量的信息在本文中:开始使用Java在Heroku。相反,我们将查看所需的步骤在您的环境已经准备好了。
第一步是创建一个Git存储库从你的项目:
$ git init
Initialized empty Git repository in /.../simple-heroku-webapp/.git/
然后,创建一个Heroku实例和远程引用添加到您的Git存储库:
$ heroku create
Creating simple-heroku-webapp... done, stack is cedar
http://simple-heroku-webapp.herokuapp.com/ | [email protected]:simple-heroku-webapp.git
Git remote heroku added
请注意
实例的名称改变输出 simple-heroku-webapp。你将被命名为更像 tranquil-basin-4744.
添加和提交文件到你的Git存储库:
$ git add src/ pom.xml Procfile system.properties
$ git commit -a -m "initial commit"
[master (root-commit) e2b58e3] initial commit
7 files changed, 221 insertions(+)
create mode 100644 Procfile
create mode 100644 pom.xml
create mode 100644 src/main/java/com/example/MyResource.java
create mode 100644 src/main/java/com/example/heroku/Main.java
create mode 100644 src/main/webapp/WEB-INF/web.xml
create mode 100644 src/test/java/com/example/MyResourceTest.java
create mode 100644 system.properties
Heroku 提交变化:
$ git push heroku master
Counting objects: 21, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (11/11), done.
Writing objects: 100% (21/21), 3.73 KiB | 0 bytes/s, done.
Total 21 (delta 0), reused 0 (delta 0)
-----> Java app detected
-----> Installing OpenJDK 1.7... done
-----> Installing Maven 3.0.3... done
-----> Installing settings.xml... done
-----> executing /app/tmp/cache/.maven/bin/mvn -B -Duser.home=/tmp/build_992cc747-26d6-4800-bdb1-add47b9583cd -Dmaven.repo.local=/app/tmp/cache/.m2/repository -s /app/tmp/cache/.m2/settings.xml -DskipTests=true clean install
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building simple-heroku-webapp 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.4.1:clean (default-clean) @ simple-heroku-webapp ---
[INFO]
[INFO] --- maven-resources-plugin:2.4.3:resources (default-resources) @ simple-heroku-webapp ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory /tmp/build_992cc747-26d6-4800-bdb1-add47b9583cd/src/main/resources
[INFO]
[INFO] --- maven-compiler-plugin:2.5.1:compile (default-compile) @ simple-heroku-webapp ---
[INFO] Compiling 2 source files to /tmp/build_992cc747-26d6-4800-bdb1-add47b9583cd/target/classes
[INFO]
[INFO] --- maven-resources-plugin:2.4.3:testResources (default-testResources) @ simple-heroku-webapp ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory /tmp/build_992cc747-26d6-4800-bdb1-add47b9583cd/src/test/resources
[INFO]
[INFO] --- maven-compiler-plugin:2.5.1:testCompile (default-testCompile) @ simple-heroku-webapp ---
[INFO] Compiling 1 source file to /tmp/build_992cc747-26d6-4800-bdb1-add47b9583cd/target/test-classes
[INFO]
[INFO] --- maven-surefire-plugin:2.7.2:test (default-test) @ simple-heroku-webapp ---
[INFO] Tests are skipped.
[INFO]
[INFO] --- maven-war-plugin:2.1.1:war (default-war) @ simple-heroku-webapp ---
[INFO] Packaging webapp
[INFO] Assembling webapp [simple-heroku-webapp] in [/tmp/build_992cc747-26d6-4800-bdb1-add47b9583cd/target/simple-heroku-webapp]
[INFO] Processing war project
[INFO] Copying webapp resources [/tmp/build_992cc747-26d6-4800-bdb1-add47b9583cd/src/main/webapp]
[INFO] Webapp assembled in [88 msecs]
[INFO] Building war: /tmp/build_992cc747-26d6-4800-bdb1-add47b9583cd/target/simple-heroku-webapp.war
[INFO] WEB-INF/web.xml already added, skipping
[INFO]
[INFO] --- maven-dependency-plugin:2.1:copy-dependencies (copy-dependencies) @ simple-heroku-webapp ---
[INFO] Copying guava-14.0.1.jar to /tmp/build_992cc747-26d6-4800-bdb1-add47b9583cd/target/dependency/guava-14.0.1.jar
[INFO] Copying javax.annotation-api-1.2.jar to /tmp/build_992cc747-26d6-4800-bdb1-add47b9583cd/target/dependency/javax.annotation-api-1.2.jar
[INFO] Copying validation-api-1.1.0.Final.jar to /tmp/build_992cc747-26d6-4800-bdb1-add47b9583cd/target/dependency/validation-api-1.1.0.Final.jar
[INFO] Copying javax.ws.rs-api-2.0.jar to /tmp/build_992cc747-26d6-4800-bdb1-add47b9583cd/target/dependency/javax.ws.rs-api-2.0.jar
[INFO] Copying jetty-http-9.0.6.v20130930.jar to /tmp/build_992cc747-26d6-4800-bdb1-add47b9583cd/target/dependency/jetty-http-9.0.6.v20130930.jar
[INFO] Copying jetty-io-9.0.6.v20130930.jar to /tmp/build_992cc747-26d6-4800-bdb1-add47b9583cd/target/dependency/jetty-io-9.0.6.v20130930.jar
[INFO] Copying jetty-security-9.0.6.v20130930.jar to /tmp/build_992cc747-26d6-4800-bdb1-add47b9583cd/target/dependency/jetty-security-9.0.6.v20130930.jar
[INFO] Copying jetty-server-9.0.6.v20130930.jar to /tmp/build_992cc747-26d6-4800-bdb1-add47b9583cd/target/dependency/jetty-server-9.0.6.v20130930.jar
[INFO] Copying jetty-servlet-9.0.6.v20130930.jar to /tmp/build_992cc747-26d6-4800-bdb1-add47b9583cd/target/dependency/jetty-servlet-9.0.6.v20130930.jar
[INFO] Copying jetty-util-9.0.6.v20130930.jar to /tmp/build_992cc747-26d6-4800-bdb1-add47b9583cd/target/dependency/jetty-util-9.0.6.v20130930.jar
[INFO] Copying jetty-webapp-9.0.6.v20130930.jar to /tmp/build_992cc747-26d6-4800-bdb1-add47b9583cd/target/dependency/jetty-webapp-9.0.6.v20130930.jar
[INFO] Copying jetty-xml-9.0.6.v20130930.jar to /tmp/build_992cc747-26d6-4800-bdb1-add47b9583cd/target/dependency/jetty-xml-9.0.6.v20130930.jar
[INFO] Copying javax.servlet-3.0.0.v201112011016.jar to /tmp/build_992cc747-26d6-4800-bdb1-add47b9583cd/target/dependency/javax.servlet-3.0.0.v201112011016.jar
[INFO] Copying hk2-api-2.2.0-b21.jar to /tmp/build_992cc747-26d6-4800-bdb1-add47b9583cd/target/dependency/hk2-api-2.2.0-b21.jar
[INFO] Copying hk2-locator-2.2.0-b21.jar to /tmp/build_992cc747-26d6-4800-bdb1-add47b9583cd/target/dependency/hk2-locator-2.2.0-b21.jar
[INFO] Copying hk2-utils-2.2.0-b21.jar to /tmp/build_992cc747-26d6-4800-bdb1-add47b9583cd/target/dependency/hk2-utils-2.2.0-b21.jar
[INFO] Copying osgi-resource-locator-1.0.1.jar to /tmp/build_992cc747-26d6-4800-bdb1-add47b9583cd/target/dependency/osgi-resource-locator-1.0.1.jar
[INFO] Copying asm-all-repackaged-2.2.0-b21.jar to /tmp/build_992cc747-26d6-4800-bdb1-add47b9583cd/target/dependency/asm-all-repackaged-2.2.0-b21.jar
[INFO] Copying cglib-2.2.0-b21.jar to /tmp/build_992cc747-26d6-4800-bdb1-add47b9583cd/target/dependency/cglib-2.2.0-b21.jar
[INFO] Copying javax.inject-2.2.0-b21.jar to /tmp/build_992cc747-26d6-4800-bdb1-add47b9583cd/target/dependency/javax.inject-2.2.0-b21.jar
[INFO] Copying jersey-container-servlet-2.5.jar to /tmp/build_992cc747-26d6-4800-bdb1-add47b9583cd/target/dependency/jersey-container-servlet-2.5.jar
[INFO] Copying jersey-container-servlet-core-2.5.jar to /tmp/build_992cc747-26d6-4800-bdb1-add47b9583cd/target/dependency/jersey-container-servlet-core-2.5.jar
[INFO] Copying jersey-client-2.5.jar to /tmp/build_992cc747-26d6-4800-bdb1-add47b9583cd/target/dependency/jersey-client-2.5.jar
[INFO] Copying jersey-common-2.5.jar to /tmp/build_992cc747-26d6-4800-bdb1-add47b9583cd/target/dependency/jersey-common-2.5.jar
[INFO] Copying jersey-server-2.5.jar to /tmp/build_992cc747-26d6-4800-bdb1-add47b9583cd/target/dependency/jersey-server-2.5.jar
[INFO]
[INFO] --- maven-install-plugin:2.3.1:install (default-install) @ simple-heroku-webapp ---
[INFO] Installing /tmp/build_992cc747-26d6-4800-bdb1-add47b9583cd/target/simple-heroku-webapp.war to /app/tmp/cache/.m2/repository/com/example/simple-heroku-webapp/1.0-SNAPSHOT/simple-heroku-webapp-1.0-SNAPSHOT.war
[INFO] Installing /tmp/build_992cc747-26d6-4800-bdb1-add47b9583cd/pom.xml to /app/tmp/cache/.m2/repository/com/example/simple-heroku-webapp/1.0-SNAPSHOT/simple-heroku-webapp-1.0-SNAPSHOT.pom
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 45.861s
[INFO] Finished at: Mon Dec 09 19:51:34 UTC 2013
[INFO] Final Memory: 17M/514M
[INFO] ------------------------------------------------------------------------
-----> Discovering process types
Procfile declares types -> web
-----> Compiled slug size: 75.9MB
-----> Launching... done, v6
http://simple-heroku-webapp.herokuapp.com deployed to Heroku
To [email protected]:simple-heroku-webapp.git
* [new branch] master -> master
现在您可以访问您的应用程序,例如:http://simple-heroku-webapp.herokuapp.com/myresource
1.6。探索其他Jersey的例子
在上面的部分中,我们已经介绍了一个方法如何使用Jersey快速构建项目。请咨询Jersey用户指南的其他部分以了解更多关于Jersey和jax - rs。即使我们尽力覆盖尽可能多的用户指南,总有一个机会,你将无法得到一个完整的回答问题的解决。在这种情况下,考虑潜水在我们的例子中,提供额外的技巧和提示功能你可能想要在您的项目中使用。
Jersey代码库包含许多有用的例子如何使用各种jax - rs和Jersey特性。随意浏览代码的个人Jersey的例子在Jersey源码库中。离线浏览,你也可以下载一个包的所有的例子在这里.