Java 从一个胖子那里跑码头

Java 从一个胖子那里跑码头,java,gradle,jetty,executable-jar,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 Excepti

我正在开发一个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?

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

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

如果要从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 2014年4月23日星期三15:11:44英国夏令时META-INF/ 2014年4月23日星期三15:11:44英国夏令时META-INF/MANIFEST.MF 2014年4月23日星期三15:11:24英国夏令时/ 2014年4月23日星期三15:06:40英国夏令时stuff/myresource.xml


C:\dev8\stack\u overflow>

最终成功地对其进行了排序,结果非常简单。只需交换这一行:

root.setDescriptor(Thread.currentThread().getContextClassLoader().getResource("web.xml")
        .getPath());
对于这一个:

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

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

谢谢你的回答。不幸的是,在这种情况下,它实际上并不适用,因为我需要向setContextPath方法传递一个字符串。谢谢你的帮助:)这是重点,谢谢。我刚从一个外部资源文件夹切换到一个可运行的Uber jar,需要做这个更改。