我正在使用jetty-server:9.2.11,我希望在我的嵌入式jetty应用程序中有一个用于war部署的webapps目录,就像我们使用独立jetty服务器时那样。我阅读了一些文档,发现“Like Jetty XML”编程配置如下所示
// Path to as-built jetty-distribution directory
String jettyHomeBuild = "../../jetty-distribution/target/distribution";
// Find jetty home and base directories
String homePath = System.getProperty("jetty.home", jettyHomeBuild);
File homeDir = new File(homePath);
if (!homeDir.exists())
{
throw new FileNotFoundException(homeDir.getAbsolutePath());
}
String basePath = System.getProperty("jetty.base", homeDir + "/demo-base");
File baseDir = new File(basePath);
if(!baseDir.exists())
{
throw new FileNotFoundException(baseDir.getAbsolutePath());
}
// Configure jetty.home and jetty.base system properties
String jetty_home = homeDir.getAbsolutePath();
String jetty_base = baseDir.getAbsolutePath();
System.setProperty("jetty.home", jetty_home);
System.setProperty("jetty.base", jetty_base);
// === jetty-deploy.xml ===
DeploymentManager deployer = new DeploymentManager();
deployer.setContexts(contexts);
deployer.setContextAttribute(
"org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern",
".*/servlet-api-[^/]*\\.jar$");
WebAppProvider webapp_provider = new WebAppProvider();
webapp_provider.setMonitoredDirName(jetty_base + "/webapps");
webapp_provider.setDefaultsDescriptor(jetty_home + "/etc/webdefault.xml");
webapp_provider.setScanInterval(1);
webapp_provider.setExtractWars(true);
webapp_provider.setConfigurationManager(new PropertiesConfigurationManager());
deployer.addAppProvider(webapp_provider);
server.addBean(deployer);
但这里使用“jetty-distribution”,但我的 lib 目录中只有与 jetty 相关的 jar 文件,这些文件被复制为 Maven 依赖项。我有点被困在这里做我的配置,为我的嵌入式 jetty 应用程序设置“jetty.home”,因为我没有使用任何标准的 jetty 发行版。我只有单独的 jar 。
最佳答案
jetty.home
在使用 embedded-jetty 时意义不大。
LikeJettyXml
正如其名称所暗示的那样,它是 jetty-distribution 的 etc/jetty-*.xml
文件的 java 版本,这就是它的全部内容和声明是。
如果您想设置一个 webapps
目录(又名带有 WebAppProvider
的 DeploymentManager
),那么就这样做。
为了在这方面取得一些成功,您需要了解 Jetty 的运行和功能的相当多的内容,重点是 DeploymentManager
和 WebAppContext
.
虽然LikeJettyXml
向您展示了一些功能,但它是从jetty-distribution而不是嵌入式jetty的角度向您展示的。
例如:
- jetty-distribution 有一个
etc/webdefault.xml
,它由setDefaultsDescriptor()
调用引用,但不需要设置,因为DeploymentManager
可以只使用 jar 文件中存在的相同 webdefault.xml。 - jetty-distribution 有一个 jetty.base,当您启用
deploy
模块时,它可以预先构建${jetty.base}/webapps
目录。该目录、jetty.base 的概念、模块的思想和功能,甚至名称webapps
都是任意的,对于嵌入式jetty 来说不需要以这种方式存在。将该目录放在您想要的任何位置,将其命名为您想要的任何名称。 scanInterval
、extractWars
、ConfigurationManager
都是可选的。事实上,唯一必需的配置是setMonitoredDirName
和setContexts
- 大多数嵌入式 jetty 设置都不需要设置
ContainerIncludeJarPattern
(有关该属性的信息,请参阅 stackoverflow 上的其他问题) - 设置系统属性对于embedded-jetty来说也是没有意义的,embedded-jetty中没有任何东西使用这些属性(这些属性仅存在于jetty-distribution、它的start.jar和各种
${jetty.home}/etc/*.xml
文件)
希望这会有所帮助,并且请花一些时间来真正了解 Jetty 中的部署是如何工作的(DeploymentManager
的 javadoc 很好地解释了这一点)。
部署可能是一个很大的话题,因此尝试在一个 stackoverflow 答案中涵盖所有内容超出了范围。
你会想了解:
- Jetty 组件
LifeCycle
DeploymentManager
角色- 部署
AppLifeCycle
AppProvider
角色WebAppContext
- 服务器/
WebAppContext
配置
类 - WebAppContext 初始化生命周期
关于maven - 如何使用maven设置jetty.home嵌入式jetty,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39366095/