由gradle构建的嵌入式jetty应用程序始终从jar中启动时返回500(内部服务器错误) [英] Embedded jetty application built by gradle always returns a 500 (internal server error) when launched from jar
问题描述
我写了最简单的 jetty
application:HelloWorldJetty
绑定到端口8080
并且总是返回'Hello World' code> on
http
请求。
使用gradle配置构建。当我使用Gradle支持netbeans插件来调试应用程序时,它可以工作,并且我得到了hello world响应。
现在,当我构建jar并使用 java -jar
HelloWorldJetty.jar
,它绑定到 port 8080
但所有响应都有状态500 - 内部服务器错误
。 我以前从未使用过嵌入式服务器,感觉就像我错过了一些东西。
以下是主要类:
包com.helloworldjetty;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
导入org.eclipse.jetty.server.Request;
导入org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.AbstractHandler;
/ **
*
* @author george
* /
公共类HelloWorldJetty {
/ **
* @param args命令行参数
* /
public static void main(String [] args){
try {
Server server = new Server(8080) ;
server.setHandler(new AbstractHandler(){
$ b @Override
public void handle(String string,Request rqst,HttpServletRequest hsr,HttpServletResponse hsr1)throws IOException,ServletException {
hsr1.setContentType(text / html; charset = utf-8);
hsr1.setStatus(HttpServletResponse.SC_OK);
rqst.setHandled(true);
hsr1.getWriter ().println(< h1> Hello World< / h1>);
}
});
server.start();
server.join();
} catch(Exception e){
e.printStackTrace(System.out);
$ p $这里是我的gradle构建脚本:
apply plugin:'java'
sourceCompatibility ='1.7'
[compileJava ,compileTestJava] *。options * .encoding ='UTF-8'
// NetBeans将自动添加依赖于
//mainClass属性的运行和调试任务。然而,您可以在执行
//任务之前定义属性,方法是传递-PmainClass =< QUALIFIED_CLASS_NAME>论据。
//
//然而请注意,如果您
//偏好,您可以定义自己的运行和调试任务。在这种情况下,NetBeans不会添加这些任务,但您可能依赖于
//您自己的实现。
if(!hasProperty('mainClass')){
ext.mainClass ='com.helloworldjetty.HelloWorldJetty'
}
repositories {
mavenCentral ()
//您可以定义其他存储库,甚至可以删除mavenCentral()。
//阅读更多关于存储库的信息:
// http://www.gradle.org/docs/current/userguide/dependency_management.html#sec:repositories
}
依赖关系{
// TODO:在这里添加依赖关系...
//你可以阅读更多关于如何在这里添加依赖关系:
// http://www.gradle .org / docs / current / userguide / dependency_management.html#sec:how_to_declare_your_dependencies
编译组:'javax',名称:'javaee-api',版本:'7.0'
编译组:'commons- beanutils',名称:'commons-beanutils',版本:'1.8.3'
编译组:'commons-httpclient',名称:'commons-httpclient',版本:'3.1'
编译组:'commons-collections',name:'commons-collections',版本:'3.2.1'
编译组:'org.apache.velocity',名称:'velocity',版本:'1.7'
编译组:'commons-codec',名称:'commons-codec',版本:'1.9'
编译组:'commons-io',名称:'commons-io',版本:'2.4'
编译组:'com.google.guava',名称:'guava',版本:'r07'
编译组:'commons-lang',名称:'commons-lang',版本:'2.5'
编译组:'org.apache.httpcomponents',名称:'httpclient',版本:'4.3.3 '
编译组:'org.apache.httpcomponents',名称:'httpmime',版本:'4.3.3'
编译组:'javax.mail',名称:'javax.mail-api ',版本:'1.5.4'
编译组:'com.googlecode.libphonenumber',名称:'libphonenumber',版本:'6.2.2'
编译组:'org.slf4j', name:'jcl-over-slf4j',版本:'1.6.1'
编译组:'org.slf4j',名称:'slf4j-api',版本:'1.6.1'
编译组:'org.slf4j',名称:'slf4j-jdk14',版本:'1.6.1'
编译组:'commons-fileupload',名称:'commons-fileupload',版本: '1.2.2'
编译组:'commons-validator',名称:'commons-validator',版本:'1.4.0'
编译组:'org.apache.httpcomponents',名称: 'httpcore',版本:'4.3.2'
编译组:'org.apache.httpcomponents',名称:'httpcore-nio',版本:'4.1'
编译组:'org.eclipse .jetty.aggregate',名称:'jetty-all',版本:'9.3.4.RC0'
编译组:'mysql',名称:'mysql-connector-java',版本:'5.1.20 '
编译组:'com.google.code.svenson',名称:'svenson',版本:'1.3.8'
testCompile组:'junit',name:'junit ',版本:'4.10'
}
jar {
from(configurations.compile.collect {it.isDirectory()?它:zipTree(it)}){
排除META-INF / *。SF
排除META-INF / * .DSA
排除META-INF / * .RSA
manifest {
attributes'Implementation-Title':'HelloWorldJetty',
'Implementation-Version':1.0,
'由':System.getProperty('user.name'),
'Built-Date':new Date(),
'Built-JDK':System.getProperty('java.version'),
'Main-Class':'com.helloworldjetty.HelloWorldJetty'
}
}
如果有人能够对此问题进行阐述,我会非常感激。
- 为Jetty服务器执行uber-jar是可能的。
Jetty项目甚至保留了 embedded-jetty-uber-jar
示例项目证明了这一点。
他们还维护一个 embedded-jetty-live-war
这个例子可以让一个war文件自动执行。
然而,这些例子都使用maven与超级jar-maven插件。
注意:Jetty项目在工作人员身上有2个Apache Maven提交者
现在转到您的gradle build。
-
不要使用码头-all
构件中的工件(那不是什么该工件存在于)
为您需要的功能/模块使用特定的工件。
-
-
使用稳定/发布的Jetty版本
9.3.0.RC0
不稳定,这就是一个不稳定的候选版本。
截至2015年10月27日,目前稳定的Jetty版本为 9.3.5.v20151012 <
-
将您的webapp元数据(如果有的话)合并到您的uber-jar中
- 合并您的
META-I NF / services
放入你的超级罐子里
I'm experiencing an issue that I do not quite get.
I've written the simplest jetty
application:HelloWorldJetty
that binds to port 8080
and always returns 'Hello World'
on http
requests.
The build is configured using gradle. When I use the gradle support netbeans plugin to debug the application, it works and I get the hello world response.
Now when I build the jar and execute it using java -jar
HelloWorldJetty.jar
, it does bind to port 8080
but all responses have status 500 - internal server error
.
I've never worked with an embedded server before and it feels like I'm missing something. Been searching around for days.
Here's the main class:
package com.helloworldjetty;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.AbstractHandler;
/**
*
* @author george
*/
public class HelloWorldJetty {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
try {
Server server = new Server(8080);
server.setHandler(new AbstractHandler() {
@Override
public void handle(String string, Request rqst, HttpServletRequest hsr, HttpServletResponse hsr1) throws IOException, ServletException {
hsr1.setContentType("text/html;charset=utf-8");
hsr1.setStatus(HttpServletResponse.SC_OK);
rqst.setHandled(true);
hsr1.getWriter().println("<h1>Hello World</h1>");
}
});
server.start();
server.join();
} catch (Exception e) {
e.printStackTrace(System.out);
}
}
}
And here's my gradle build script:
apply plugin: 'java'
sourceCompatibility = '1.7'
[compileJava, compileTestJava]*.options*.encoding = 'UTF-8'
// NetBeans will automatically add "run" and "debug" tasks relying on the
// "mainClass" property. You may however define the property prior executing
// tasks by passing a "-PmainClass=<QUALIFIED_CLASS_NAME>" argument.
//
// Note however, that you may define your own "run" and "debug" task if you
// prefer. In this case NetBeans will not add these tasks but you may rely on
// your own implementation.
if (!hasProperty('mainClass')) {
ext.mainClass = 'com.helloworldjetty.HelloWorldJetty'
}
repositories {
mavenCentral()
// You may define additional repositories, or even remove "mavenCentral()".
// Read more about repositories here:
// http://www.gradle.org/docs/current/userguide/dependency_management.html#sec:repositories
}
dependencies {
// TODO: Add dependencies here ...
// You can read more about how to add dependency here:
// http://www.gradle.org/docs/current/userguide/dependency_management.html#sec:how_to_declare_your_dependencies
compile group: 'javax', name: 'javaee-api', version: '7.0'
compile group: 'commons-beanutils', name: 'commons-beanutils', version: '1.8.3'
compile group: 'commons-httpclient', name: 'commons-httpclient', version: '3.1'
compile group: 'commons-collections', name: 'commons-collections', version: '3.2.1'
compile group: 'org.apache.velocity', name: 'velocity', version: '1.7'
compile group: 'commons-codec', name: 'commons-codec', version: '1.9'
compile group: 'commons-io', name: 'commons-io', version: '2.4'
compile group: 'com.google.guava', name: 'guava', version: 'r07'
compile group: 'commons-lang', name: 'commons-lang', version: '2.5'
compile group: 'org.apache.httpcomponents', name: 'httpclient', version: '4.3.3'
compile group: 'org.apache.httpcomponents', name: 'httpmime', version: '4.3.3'
compile group: 'javax.mail', name: 'javax.mail-api', version: '1.5.4'
compile group: 'com.googlecode.libphonenumber', name: 'libphonenumber', version: '6.2.2'
compile group: 'org.slf4j', name: 'jcl-over-slf4j', version: '1.6.1'
compile group: 'org.slf4j', name: 'slf4j-api', version: '1.6.1'
compile group: 'org.slf4j', name: 'slf4j-jdk14', version: '1.6.1'
compile group: 'commons-fileupload', name: 'commons-fileupload', version: '1.2.2'
compile group: 'commons-validator', name: 'commons-validator', version: '1.4.0'
compile group: 'org.apache.httpcomponents', name: 'httpcore', version: '4.3.2'
compile group: 'org.apache.httpcomponents', name: 'httpcore-nio', version: '4.1'
compile group: 'org.eclipse.jetty.aggregate', name: 'jetty-all', version: '9.3.4.RC0'
compile group: 'mysql', name: 'mysql-connector-java', version: '5.1.20'
compile group: 'com.google.code.svenson', name: 'svenson', version: '1.3.8'
testCompile group: 'junit', name: 'junit', version: '4.10'
}
jar {
from(configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }) {
exclude "META-INF/*.SF"
exclude "META-INF/*.DSA"
exclude "META-INF/*.RSA"
}
manifest {
attributes 'Implementation-Title': 'HelloWorldJetty',
'Implementation-Version': 1.0,
'Built-By': System.getProperty('user.name'),
'Built-Date': new Date(),
'Built-JDK': System.getProperty('java.version'),
'Main-Class': 'com.helloworldjetty.HelloWorldJetty'
}
}
If anyone could shed some light on this issue I'd really appreciate it.
解决方案 Having a self-executing uber-jar for a Jetty server is possible.
The Jetty Project even maintains a embedded-jetty-uber-jar
example project demonstrating this.
They also maintain a embedded-jetty-live-war
example that makes a war file that is also self-executing.
However, these examples both use maven with the uber-jar maven plugin.
Note: the Jetty project has 2 Apache Maven committers on staff
Now to your gradle build.
Don't use the jetty-all
artifact in your build (that's not what that artifact exists for)
Use specific artifacts for the features / modules that you need.
Use a stable/released version of Jetty
9.3.0.RC0
is NOT stable, that's an unstable release candidate.
As of Oct 27, 2015, the current stable Jetty version is 9.3.5.v20151012
Merge your webapp metadata (if you have any) into your uber-jar
- Merge your
META-INF/services
into your uber-jar
这篇关于由gradle构建的嵌入式jetty应用程序始终从jar中启动时返回500(内部服务器错误)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!