- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个嵌入式 jetty 服务器,可以热部署网络应用程序。在部署其他war时,我在目录下添加了一个deployment descriptor.xml来配置webappcontext。我希望将在另一个位置构建的 jar 目录添加到热部署 war (/extJars) 的类路径中。我在 webapp descriptor.xml 中看到了如何执行此操作,我可以通过声明单个 jar 来完成此操作,但我尝试了多种配置来尝试简单地读取此目录中的所有 jar,但没有任何效果。这是我的 otherWebApp.xml,我们将调用它,其中包含一个有效的配置,并注释掉无效的配置。谢谢。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
<Configure class="org.eclipse.jetty.webapp.WebAppContext">
<Set name="war"><SystemProperty name="JETTY_HOME" default="." />/extApps/otherWebApp.war</Set>
<Set name="contextPath">/otherWebApp</Set>
<Set name="tempDirectory" ><SystemProperty name="JETTY_HOME" />/jetty/webapps/otherWebApp</Set>
<Set name="extraClasspath"><SystemProperty name="JETTY_HOME" />/extJars/cadi-core-1.0.12.jar,<SystemProperty name="JETTY_HOME" />/extJars/cadi-aaf-1.0.12.jar,<SystemProperty name="JETTY_HOME" />/extJars/GLCookieDecryption-1.0.jar,<SystemProperty name="JETTY_HOME" />/extJars/rosetta-1.1.1.jar,<SystemProperty name="AJSC_HOME" />/extJars/env-1.4.2.jar,<SystemProperty name="JETTY_HOME" />/extJars/dme2-2.5.22.jar</Set>
<!-- <Set name="extraClasspath"><SystemProperty name="JETTY_HOME" />/extJars/</Set>
</Configure> doesn't work -->
<!-- <Set name="extraClasspath"><SystemProperty name="JETTY_HOME" />/extJars/*</Set>
</Configure> doesn't work -->
<!-- <Set name="extraClasspath"><SystemProperty name="JETTY_HOME" />/extJars/*.jar</Set>
</Configure> doesn't work -->
<!-- <Set name="extraClasspath"><SystemProperty name="JETTY_HOME" />/extJars</Set>
</Configure> doesn't work -->
最佳答案
您有 3 个选择。
1:使用父加载器优先级
在嵌入式中,告诉 WebAppContext 使用父加载器优先级。 (这将有利于服务器类而不是 webapp 类)
<Configure class="org.eclipse.jetty.webapp.WebAppContext">
<Set name="contextPath">/example</Set>
<Set name="war">example.war</Set>
<Set name="parentLoaderPriority">true</Set>
</Configure>
这确实有一个副作用,如果服务器类对信息进行任何缓存(许多库中的一种常见技术),那么该缓存现在可用于所有 Web 应用程序。
2:使用自定义 DeploymentManager 绑定(bind)来管理 WebAppClassloader
每个 WebAppContext 使用一个 WebAppClassloader 可以配置为:
由于您使用的是 DeploymentManager
,这可以通过绑定(bind)技术进行标准化。
绑定(bind)本身:ExposeServerCommonBinding.java
package jetty;
import org.eclipse.jetty.deploy.App;
import org.eclipse.jetty.deploy.AppLifeCycle;
import org.eclipse.jetty.deploy.graph.Node;
import org.eclipse.jetty.server.handler.ContextHandler;
import org.eclipse.jetty.webapp.WebAppContext;
public class ExposeServerCommonBinding implements AppLifeCycle.Binding
{
public String[] getBindingTargets()
{
return new String[]
{ "deploying" };
}
public void processBinding(Node node, App app) throws Exception
{
ContextHandler handler = app.getContextHandler();
if (handler == null)
{
throw new NullPointerException("No Handler created for App: " + app);
}
if (handler instanceof WebAppContext)
{
WebAppContext webapp = (WebAppContext)handler;
// System classes (or namespaces) present in server classloader to expose to webapp
webapp.addSystemClass("org.apache.log4j.");
webapp.addSystemClass("org.slf4j.");
webapp.addSystemClass("org.apache.commons.logging.");
// Server classes that cannot be overridden by webapp
webapp.addServerClass("-org.apache.log4j.");
webapp.addServerClass("-org.slf4j.");
webapp.addServerClass("-org.apache.commons.logging.");
}
}
}
以及如何使用它
DeploymentManager mgr = new DeploymentManager();
WebAppProvider provider = new WebAppProvider();
provider.setMonitoredDirResource(Resource.newResource(new File("./webapps/")));
mgr.addAppProvider(provider);
mgr.addLifeCycleBinding(new ExposeServerCommonBinding());
此技术将应用于通过 DeploymentManager 部署的所有 WebAppContext,允许您将这些规则同等地应用于所有 Web 应用。
3:使用自定义 DeploymentManager 绑定(bind)来管理 extraClasspath
这是另一个绑定(bind)替代方案,您可以使用它在服务器端预先构建 extraClasspath,并且在部署 WebApp 时,它会自动将这些 extraClasspath 添加到 WebApp。
package jetty;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import org.eclipse.jetty.deploy.App;
import org.eclipse.jetty.deploy.AppLifeCycle;
import org.eclipse.jetty.deploy.graph.Node;
import org.eclipse.jetty.server.handler.ContextHandler;
import org.eclipse.jetty.webapp.WebAppContext;
public class CommonExtraClasspathBinding implements AppLifeCycle.Binding
{
private List<File> extraClasspath = new ArrayList<>();
public String[] getBindingTargets()
{
return new String[] { "deploying" };
}
public void addAllJars(File dir)
{
for (File file : dir.listFiles())
{
if (!file.isFile())
{
continue;
}
if (file.getName().toLowerCase(Locale.ENGLISH).equals(".jar"))
{
addJar(file);
}
}
}
public void addJar(File jar)
{
if (jar.exists() && jar.isFile())
{
extraClasspath.add(jar);
}
}
public void processBinding(Node node, App app) throws Exception
{
ContextHandler handler = app.getContextHandler();
if (handler == null)
{
throw new NullPointerException("No Handler created for App: " + app);
}
if (handler instanceof WebAppContext)
{
WebAppContext webapp = (WebAppContext)handler;
StringBuilder xtraCp = new StringBuilder();
boolean delim = false;
for (File cp : extraClasspath)
{
if (delim)
{
xtraCp.append(File.pathSeparatorChar);
}
xtraCp.append(cp.getAbsolutePath());
delim = true;
}
webapp.setExtraClasspath(xtraCp.toString());
}
}
}
关于java - 通过 WebAppContext extraClasspath 管理许多 jar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26128278/
通过为 maven 依赖项提供 spark-classPath 来减少应用程序 jar 的大小: 我的集群有 3 个运行 hadoop 和 spark 的 ec2 实例。如果我使用 maven 依赖项
我想在通过 Apache Livy 将 Spark 作业提交到 Azure 集群时添加一些配置。目前,要通过集群中的 Apache Livy 启动 Spark 作业,我使用以下命令 curl -X P
我有一个嵌入式 jetty 服务器,可以热部署网络应用程序。在部署其他war时,我在目录下添加了一个deployment descriptor.xml来配置webappcontext。我希望将在另一个
我的项目 jar 与 EMR 上的 jar 冲突,因此要解决此问题我已通过引导脚本将所有高级 jar 复制到节点的自定义位置。我已经验证 jar 已复制到所有执行器节点上。 它与spark-submi
我是一名优秀的程序员,十分优秀!