3 가지 선택 사항이 있습니다.
1 : 내장에서
사용 부모 로더 우선 순위, 부모 로더 우선 순위를 사용하도록 WebAppContext을 말한다. (이것은 웹 애플리케이션 클래스를 통해 서버 클래스를 선호합니다)
<Configure class="org.eclipse.jetty.webapp.WebAppContext">
<Set name="contextPath">/example</Set>
<Set name="war">example.war</Set>
<Set name="parentLoaderPriority">true</Set>
</Configure>
이 서버 클래스는 정보의 캐싱 (많은 도서관에서 일반적인 기술)을 수행하는 경우 그 캐시가 모든 웹 어플리케이션에 사용할 수 있습니다하는 부작용을 가지고 .
2 : 각 WebAppContext가 구성 할 수있는 WebAppClassloader 사용을 사용하여 사용자 정의 DeploymentManager가 WebAppClassloader
관리를위한 바인딩 : 서버 클래스 로더에서
- 노출 특정 클래스를
- 은 무엇 WebAppContext 구축 webapp와 서버 사이에 충돌이있는 경우 수행됩니다.
DeploymentManager
을 사용하고 있으므로 바인딩 기술을 통해 표준화 할 수 있습니다. 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를 통해 배포되는 모든 WebAppContexts에 적용됩니다를 사용하는 방법 :
자체를 바인딩 모든 웹 응용 프로그램.
는
는 3 : 웹 애플리케이션 배포 할 때 사용 사용자 정의 DeploymentManager 여기 extraClasspath
관리를위한 바인딩하는 것은 당신이 사전 빌드 서버 측에서 extraClasspath, 그리고에 사용할 수있는 또 다른 바인딩 대안의 자동이 extraClasspath 추가 웹 애플리케이션에
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'를 사용합니까? 또는 당신은'DeploymentManager'에 의지 할 것인가? –
이'extraClasspath' jar 파일은 임베디드 서버의 모든'WebAppContext' 파일에 추가 되었습니까? 또는 단지 특정 것들? –
배치 관리자를 사용하여 핫 배치 가능 폴더 위치를 작성 중입니다. 그런 다음 otherWebApp.war 및 otherWebApp를 추가하고 있습니다.xml을 폴더에 저장하고 배포 관리자가 XML 기반의 전쟁을 핫 전개합니다. 엄밀히 말하자면, 이러한 여분의 jar는 메인 webapp 용 클래스 로더에 의해 추가되지만,이 jar는 otherWebApp에서도 사용해야합니다. 전체적인 디자인/워크 플로우는 기본 webAppContext와 최신 배포 폴더를 모두 배포하는 배포 관리자를 설정하는 기본 jetty.xml을 가지고 있다고 생각합니다. 간단히 말해 모든 extJars가 xml을 사용하는 otherWebApp 클래스 경로에 있어야합니다. – user2116247