Java 从一个胖子那里跑码头
我正在开发一个java应用程序,用main方法启动jetty服务器。当我在I.d.e(STS)中运行它时,它工作得很好,但是当我使用gradle将其打包为fatjar时,服务器启动,但是没有可用的资源。它的行为方式让我相信它没有正确加载web.xml。 在遵循了一些指南之后,以下是我用来启动jetty服务器的方法: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
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,需要做这个更改。