我正在尝试使用Glassfish,Jersey和Gradle创建一个简单的Web应用程序。我已经达到了这样的程度:Glassfish的管理页面告诉我我已经成功部署了,而Glassfish日志说我的项目已经部署了,但是所有带有“请求的资源不可用”的请求404。我已经花了几个小时尝试/搜索在线信息,但是我仍然无法理解该错误。
我认为我应该访问的URL是localhost:8080 / expenditures / test,但是我也尝试过localhost:8080 / expenditures,localhost:8080 / test等,以进行健全性检查。
任何帮助将不胜感激!
目录结构:
Web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app>
<display-name>Expenditures</display-name>
<servlet>
<servlet-name>Jersey</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>com.expenditures</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
资源类别:
package com.expenditures;
import javax.annotation.Nonnull;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
@Path("/test")
public class ExpendituresServlet {
@GET
@Produces("text/plain")
@Nonnull
public String testHelloWorld() {
return "Hello, world!";
}
}
build.gradle(具有启动Glassfish服务器的任务)
apply plugin: 'java'
apply plugin: 'war'
apply plugin : 'idea'
sourceSets {
main.java.srcDirs = ['src']
// main.resources.srcDirs = ['src/resources']
}
repositories {
mavenCentral()
}
dependencies {
// https://mvnrepository.com/artifact/org.glassfish.jersey.containers/jersey-container-servlet-core
compile group: 'org.glassfish.jersey.containers', name: 'jersey-container-servlet-core', version: '2.27'
// https://mvnrepository.com/artifact/org.glassfish.jersey.media/jersey-media-json-jackson
compile group: 'org.glassfish.jersey.media', name: 'jersey-media-json-jackson', version: '2.27'
// https://mvnrepository.com/artifact/com.google.code.findbugs/jsr305
compile group: 'com.google.code.findbugs', name: 'jsr305', version: '3.0.2'
}
//Trying to deploy to Glassfish...copied from
task run(dependsOn: 'war', type:Exec) {
workingDir "dependencies/glassfish5/glassfish/bin"
if (System.properties['os.name'].toLowerCase().contains('windows')) {
commandLine 'cmd', '/c', 'asadmin.bat'
} else {
commandLine "./asadmin"
}
// args "stop-domain"
args "deploy", "--force=true", "${war.archivePath}"
// args "deploy", "${war.archivePath}"
}
我尝试通过运行进行部署:
./gradlew war && ./gradlew run
我也在glassfish5 / glassfish / bin中尝试了以下方法,结果相同:
./asadmin deploy --force=true /Users/Andrew/Documents/CodingProjects/expenditures/build/libs/expenditures.war
Glassfish server.log结尾:
[2018-07-21T18:15:47.648-0400] [glassfish 5.0] [INFO] [AS-WEB-GLUE-00172] [javax.enterprise.web] [tid: _ThreadID=42 _ThreadName=admin-listener(1)] [timeMillis: 1532211347648] [levelValue: 800] [[
Loading application [expenditures] at [/expenditures]]]
[2018-07-21T18:15:47.661-0400] [glassfish 5.0] [INFO] [] [javax.enterprise.system.core] [tid: _ThreadID=42 _ThreadName=admin-listener(1)] [timeMillis: 1532211347661] [levelValue: 800] [[
expenditures was successfully deployed in 521 milliseconds.]]
答案 0 :(得分:0)
Glassfish 4+使用Jersey2.x。您具有的web.xml配置适用于Jersey1.x。对于2.x,配置应为
<servlet>
<servlet-name>Jersey</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>com.expenditures</param-name>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
在学习泽西岛时,在搜索教程时,请记住,只要在任何地方看到com.sun.jersey
时,它就是泽西岛1.x。 Jersey 2.x将采用org.glassfish.jersey
包装。
此外,由于您正在使用Glassfish,因此服务器已经具有所有Jersey罐子。为了避免将不兼容的jar版本加倍,建议使用“提供的”作用域,这将导致构建系统仅使用项目jars进行编译,而不会将其构建到要部署到服务器的最终工件中。 scope
的概念适用于Maven。我并没有过多地使用Gradle,但是我认为它们具有类似的概念。在依赖声明中使用compile
的地方,我认为您可能还可以使用其他一些东西来获得“提供的”功能。您将不得不对此进行更多研究,因为我不确定这是什么。