嵌入式jetty中的外部文件(css,js)

时间:2014-06-06 21:23:34

标签: embedded-jetty

使用jetty,您可以轻松生成“html”响应,导入外部文件,如:

<head>
<link rel="stylesheet" type="text/css" href="myStyle.css">
<script src="myScript.js"></script>
<head>

但是,当你嵌入jetty时,你在哪里放myStyle.cssmyScript.js

特别是当jetty服务器在一个不是你写的大型OpenSource项目中时?

servlet.doGet中有一个很好的out.println(???);可以提供答案,或类似的东西吗?

1 个答案:

答案 0 :(得分:2)

我认为这取决于你如何打包你的罐子。例如,如果您将它打包成一个jar,那么您自己的代码和依赖项中的所有类和资源都会被分解为jar / war。然后,您必须相应地将webcontext设置为Jetty。使用Maven和Gradle的几个例子可能会发出一些亮点:

http://open.bekk.no/embedded-jetty-7-webapp-executable-with-maven
https://github.com/jhannes/java-ee-turnkey/

鉴于后一个例子,它可以解决这些问题:

URL[] urls = ((URLClassLoader) AbstractServerMain.class.getClassLoader()).getURLs();
WebAppContext context;
if (urls.length == 1 && urls[0].getFile().endsWith(".war")) {
    context = new WebAppContext(urls[0].getFile(), contextRoot);
} else {
    context = new WebAppContext("src/main/webapp", contextRoot);
}

这将确保您也可以从Eclipse / IntelliJ等运行。
第一个示例使用ProtectionDomain

// Get the war-file
ProtectionDomain protectionDomain = Main.class.getProtectionDomain();
String warFile = protectionDomain.getCodeSource().getLocation().toExternalForm();
String currentDir = new File(protectionDomain.getCodeSource().getLocation().getPath()).getParent();

// Add the warFile (this jar)
WebAppContext context = new WebAppContext(warFile, contextPath);

从Eclipse / IntelliJ运行时,这不太友好。

如果您选择不执行一个jar并转到Gradle应用程序插件或Maven appassembler,您可能需要将资源复制到“Main-jar”(启动Jetty的那个)或设置webcontext到包含资源的jar。现在揭示我不太熟悉如何......