由gradle构建的嵌入式jetty应用程序始终从jar中启动时返回500(内部服务器错误) [英] Embedded jetty application built by gradle always returns a 500 (internal server error) when launched from jar

查看:153
本文介绍了由gradle构建的嵌入式jetty应用程序始终从jar中启动时返回500(内部服务器错误)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



我写了最简单的 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。




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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆