从jar

时间:2015-10-21 13:49:09

标签: java gradle embedded-jetty

我遇到了一个我不太了解的问题。

我写了最简单的jetty application:HelloWorldJetty绑定到port 8080并始终在'Hello World'次请求上返回http

使用gradle配置构建。当我使用gradle support netbeans插件来调试应用程序时,它可以工作,我得到了hello world响应。

现在当我构建jar并使用java -jar HelloWorldJetty.jar执行它时,它确实绑定到port 8080,但所有响应都有status 500 - internal server error

我之前从未使用过嵌入式服务器,感觉我错过了什么。一直在寻找好几天。

这是主要课程:

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);
        }
    }
}

这是我的gradle构建脚本:

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'
    }
}

如果有人能对这个问题有所了解,我真的很感激。

1 个答案:

答案 0 :(得分:1)

可以为Jetty服务器提供自动执行的uber-jar。

Jetty项目甚至维护着embedded-jetty-uber-jar示例项目来证明这一点。

他们还维护一个embedded-jetty-live-war示例,该示例生成一个也是自动执行的war文件。

但是,这些示例都使用maven和uber-jar maven插件。

  

注意:Jetty项目有2个Apache Maven提交者

现在进行gradle构建。

  • 不要在构建中使用jetty-all工件(that's not what that artifact exists for

    为您需要的功能/模块使用特定工件。

  • 使用稳定/已发布的Jetty版本

    9.3.0.RC0不稳定,这是一个不稳定的候选版本。

    截至2015年10月27日,当前稳定的Jetty版本为9.3.5.v20151012

  • 将您的webapp元数据(如果有的话)合并到您的超级jar

  • 将您的META-INF/services合并到您的uber-jar