从胖子跑的码头

时间:2014-04-23 12:38:26

标签: java gradle jetty executable-jar

我正在开发一个java应用程序,它在main方法中启动一个jetty服务器。当我在i.d.e(STS)中运行它时,这很好用,但是当我使用gradle将它打包为fatjar时,服务器启动,但是没有可用的资源。它的行为方式使我相信它没有正确加载web.xml。 遵循一些指南后,这是我用来启动jetty服务器的方法:

public class JettyServer {

    public static void main(final String[] args) throws Exception {
        final Server server = new Server(8080);
        final WebAppContext root = new WebAppContext();
        root.setContextPath("/");
        root.setDescriptor(Thread.currentThread().getContextClassLoader().getResource("web.xml")
            .getPath());
        root.setResourceBase(".");
        server.setHandler(root);
        server.start();
        server.join();
    }
}

我的web.xml在我的src / main / resources中,正如我所说,当我在STS中运行时,服务器按预期启动。

这就是我在gradle中配置jar任务以构建fatjar的方法:

jar{
    from { configurations.runtime.collect { it.isDirectory() ? it : zipTree(it) } } {
        exclude "META-INF/*.SF"
        exclude "META-INF/*.DSA"
        exclude "META-INF/*.RSA"
    }
    manifest {
       attributes 'Main-Class': 'com.main.JettyServer'
    }
}

当我运行它时,jar会被构建,如果我打开jar,我可以看到我的web.xml文件,但它似乎没有被读取。我需要改变什么?我是否错误地引用了web.xml?

3 个答案:

答案 0 :(得分:1)

对于基于SWT的应用程序,我也有类似的设置。 以下代码段对我有用:

 root.setDescriptor(root + "/resources/web.xml");
 root.setResourceBase(JettyServer.class.getClassLoader().getResource(WEBAPPDIR).toExternalForm());//WEBAPPDIR Directory should end with a slash

答案 1 :(得分:1)

最后设法让它排序,这很简单。只需交换这一行:

root.setDescriptor(Thread.currentThread().getContextClassLoader().getResource("web.xml")
        .getPath());

这个:

root.setDescriptor(JettyServer.class.getResource("/WEB-INF/web.xml").toString());

我接受了Mubin的回答,因为他们让我走上了正确的道路。

答案 2 :(得分:0)

如果您想从JAR文件中读取内容,那么您需要使用getResourceAsStream()而不是getResource()。这是一个片段来说明:

public class Demo 
{
    public static void main( String[] args ) {

        ClassLoader cl = Thread.currentThread().getContextClassLoader();

        InputStream is = cl.getResourceAsStream("stuff/myresource.xml");
        if (is != null) {
            BufferedReader reader = new BufferedReader(new InputStreamReader(is));
            try {
                System.out.println(reader.readLine());
            }
            catch(Exception ex) {
                ex.printStackTrace();
            }
        }

    }
}

您可以通过在类路径上放置JAR来测试它,以便:

C:\ dev8 \ stack_overflow> jar tvf stuff.jar      0 Wed Apr 23 15:11:44 BST 2014 META-INF /     71 Wed Apr 23 15:11:44 BST 2014 META-INF / MANIFEST.MF      0 Wed Apr 23 15:11:24 BST 2014东西/     16 Wed Apr 23 15:06:40 BST 2014 stuff / myresource.xml

C:\ DEV8 \ STACK_OVERFLOW>