*
* 1 |
- * Forwarded Header |
+ * {@code Forwarded} Header |
* "{@code host=}" param (Required) |
* "{@code host=:} param (Implied) |
* "{@code proto=}" param (Optional) |
@@ -88,7 +88,7 @@
*
*
* 2 |
- * X-Forwarded-Host Header |
+ * {@code X-Forwarded-Host} Header |
* Required |
* Implied |
* n/a |
@@ -96,7 +96,7 @@
*
*
* 3 |
- * X-Forwarded-Port Header |
+ * {@code X-Forwarded-Port} Header |
* n/a |
* Required |
* n/a |
@@ -104,7 +104,7 @@
*
*
* 4 |
- * X-Forwarded-Server Header |
+ * {@code X-Forwarded-Server} Header |
* Required |
* Optional |
* n/a |
@@ -112,29 +112,29 @@
*
*
* 5 |
- * X-Forwarded-Proto Header |
+ * {@code X-Forwarded-Proto} Header |
* n/a |
* Implied from value |
* Required |
*
* left-most value becomes protocol.
*
- * - Value of "
http " means port=80.
+ * - Value of "{@code http}" means port=80.
* - Value of "{@link HttpConfiguration#getSecureScheme()}" means port={@link HttpConfiguration#getSecurePort()}.
*
* |
*
*
* 6 |
- * X-Proxied-Https Header |
+ * {@code X-Proxied-Https} Header |
* n/a |
* Implied from value |
* boolean |
*
* left-most value determines protocol and port.
*
- * - Value of "
on " means port={@link HttpConfiguration#getSecurePort()}, and protocol={@link HttpConfiguration#getSecureScheme()}).
- * - Value of "
off " means port=80, and protocol=http.
+ * - Value of "{@code on}" means port={@link HttpConfiguration#getSecurePort()}, and protocol={@link HttpConfiguration#getSecureScheme()}).
+ * - Value of "{@code off}" means port=80, and protocol=http.
*
* |
*
@@ -799,12 +799,7 @@ else if (_port == UNSET)
@Override
public String toString()
{
- final StringBuilder sb = new StringBuilder("MutableHostPort{");
- sb.append("host='").append(_host).append("'/").append(_hostSource);
- sb.append(", port=").append(_port);
- sb.append("/").append(_portSource);
- sb.append('}');
- return sb.toString();
+ return "%s@%x{host='%s'/%s, port=%d/%s}".formatted(getClass().getSimpleName(), hashCode(), _host, _hostSource, _port, _portSource);
}
}
@@ -888,7 +883,7 @@ private MutableHostPort getFor()
}
/**
- * Called if header is Proxy-auth-cert
+ * Called if header is {@code Proxy-auth-cert}
*/
public void handleCipherSuite(HttpField field)
{
@@ -904,7 +899,7 @@ public void handleCipherSuite(HttpField field)
}
/**
- * Called if header is Proxy-Ssl-Id
+ * Called if header is {@code Proxy-Ssl-Id}
*/
public void handleSslSessionId(HttpField field)
{
@@ -920,7 +915,7 @@ public void handleSslSessionId(HttpField field)
}
/**
- * Called if header is X-Forwarded-Host
+ * Called if header is {@code X-Forwarded-Host}
*/
public void handleForwardedHost(HttpField field)
{
@@ -928,7 +923,7 @@ public void handleForwardedHost(HttpField field)
}
/**
- * Called if header is X-Forwarded-For
+ * Called if header is {@code X-Forwarded-For}
*/
public void handleForwardedFor(HttpField field)
{
@@ -937,7 +932,7 @@ public void handleForwardedFor(HttpField field)
}
/**
- * Called if header is X-Forwarded-Server
+ * Called if header is {@code X-Forwarded-Server}
*/
public void handleForwardedServer(HttpField field)
{
@@ -947,7 +942,7 @@ public void handleForwardedServer(HttpField field)
}
/**
- * Called if header is X-Forwarded-Port
+ * Called if header is {@code X-Forwarded-Port}
*/
public void handleForwardedPort(HttpField field)
{
@@ -957,7 +952,7 @@ public void handleForwardedPort(HttpField field)
}
/**
- * Called if header is X-Forwarded-Proto
+ * Called if header is {@code X-Forwarded-Proto}
*/
public void handleProto(HttpField field)
{
@@ -965,7 +960,7 @@ public void handleProto(HttpField field)
}
/**
- * Called if header is X-Proxied-Https
+ * Called if header is {@code X-Proxied-Https}
*/
public void handleHttps(HttpField field)
{
@@ -988,7 +983,7 @@ else if ("off".equalsIgnoreCase(field.getValue()) || "false".equalsIgnoreCase(fi
}
/**
- * Called if header is Forwarded
+ * Called if header is {@code Forwarded}
*/
public void handleRFC7239(HttpField field)
{
diff --git a/jetty-core/jetty-server/src/main/java/org/eclipse/jetty/server/SecureRequestCustomizer.java b/jetty-core/jetty-server/src/main/java/org/eclipse/jetty/server/SecureRequestCustomizer.java
index 7cb8d5b379e0..9e4451360151 100644
--- a/jetty-core/jetty-server/src/main/java/org/eclipse/jetty/server/SecureRequestCustomizer.java
+++ b/jetty-core/jetty-server/src/main/java/org/eclipse/jetty/server/SecureRequestCustomizer.java
@@ -67,7 +67,7 @@ public SecureRequestCustomizer(@Name("sniHostCheck") boolean sniHostCheck)
/**
* @param sniHostCheck True if the SNI Host name must match.
* @param stsMaxAgeSeconds The max age in seconds for a Strict-Transport-Security response header. If set less than zero then no header is sent.
- * @param stsIncludeSubdomains If true, a include subdomain property is sent with any Strict-Transport-Security header
+ * @param stsIncludeSubdomains If true, an include subdomain property is sent with any Strict-Transport-Security header
*/
public SecureRequestCustomizer(
@Name("sniHostCheck") boolean sniHostCheck,
@@ -81,7 +81,7 @@ public SecureRequestCustomizer(
* @param sniRequired True if a SNI certificate is required.
* @param sniHostCheck True if the SNI Host name must match.
* @param stsMaxAgeSeconds The max age in seconds for a Strict-Transport-Security response header. If set less than zero then no header is sent.
- * @param stsIncludeSubdomains If true, a include subdomain property is sent with any Strict-Transport-Security header
+ * @param stsIncludeSubdomains If true, an include subdomain property is sent with any Strict-Transport-Security header
*/
public SecureRequestCustomizer(
@Name("sniRequired") boolean sniRequired,
diff --git a/jetty-core/jetty-server/src/main/java/org/eclipse/jetty/server/SizeLimitHandler.java b/jetty-core/jetty-server/src/main/java/org/eclipse/jetty/server/SizeLimitHandler.java
index 087d09c87fd2..10352585930a 100644
--- a/jetty-core/jetty-server/src/main/java/org/eclipse/jetty/server/SizeLimitHandler.java
+++ b/jetty-core/jetty-server/src/main/java/org/eclipse/jetty/server/SizeLimitHandler.java
@@ -109,6 +109,7 @@ private class SizeLimitResponseWrapper extends Response.Wrapper
{
private final HttpFields.Mutable _httpFields;
private long _written = 0;
+ private HttpException.RuntimeException _failure;
public SizeLimitResponseWrapper(Request request, Response wrapped)
{
@@ -119,7 +120,7 @@ public SizeLimitResponseWrapper(Request request, Response wrapped)
@Override
public HttpField onAddField(HttpField field)
{
- if (field.getHeader().is(HttpHeader.CONTENT_LENGTH.asString()))
+ if (field.getHeader() == HttpHeader.CONTENT_LENGTH)
{
long contentLength = field.getLongValue();
if (_responseLimit >= 0 && contentLength > _responseLimit)
@@ -139,12 +140,19 @@ public HttpFields.Mutable getHeaders()
@Override
public void write(boolean last, ByteBuffer content, Callback callback)
{
+ if (_failure != null)
+ {
+ callback.failed(_failure);
+ return;
+ }
+
if (content != null && content.remaining() > 0)
{
if (_responseLimit >= 0 && (_written + content.remaining()) > _responseLimit)
{
- String message = "Response body is too large: %d>%d".formatted(_written + content.remaining(), _responseLimit);
- callback.failed(new HttpException.RuntimeException(HttpStatus.INTERNAL_SERVER_ERROR_500, message));
+ _failure = new HttpException.RuntimeException(HttpStatus.INTERNAL_SERVER_ERROR_500,
+ "Response body is too large: %d>%d".formatted(_written + content.remaining(), _responseLimit));
+ callback.failed(_failure);
return;
}
_written += content.remaining();
diff --git a/jetty-core/jetty-server/src/test/java/org/eclipse/jetty/server/RequestTest.java b/jetty-core/jetty-server/src/test/java/org/eclipse/jetty/server/RequestTest.java
index d81bab9c4e73..14010cd6c7fc 100644
--- a/jetty-core/jetty-server/src/test/java/org/eclipse/jetty/server/RequestTest.java
+++ b/jetty-core/jetty-server/src/test/java/org/eclipse/jetty/server/RequestTest.java
@@ -16,6 +16,7 @@
import java.io.ByteArrayOutputStream;
import java.nio.ByteBuffer;
import java.util.Arrays;
+import java.util.EnumSet;
import java.util.List;
import java.util.Locale;
import java.util.concurrent.TimeUnit;
@@ -25,7 +26,10 @@
import org.eclipse.jetty.http.HttpHeader;
import org.eclipse.jetty.http.HttpStatus;
import org.eclipse.jetty.http.HttpTester;
+import org.eclipse.jetty.http.UriCompliance;
+import org.eclipse.jetty.io.Content;
import org.eclipse.jetty.server.LocalConnector.LocalEndPoint;
+import org.eclipse.jetty.server.handler.ContextHandler;
import org.eclipse.jetty.server.handler.DumpHandler;
import org.eclipse.jetty.util.Callback;
import org.eclipse.jetty.util.component.LifeCycle;
@@ -96,6 +100,49 @@ public void testEncodedPath() throws Exception
assertEquals(HttpStatus.BAD_REQUEST_400, response.getStatus());
}
+ @Test
+ public void testAmbiguousPathSep() throws Exception
+ {
+ server.stop();
+ for (Connector connector: server.getConnectors())
+ {
+ HttpConnectionFactory httpConnectionFactory = connector.getConnectionFactory(HttpConnectionFactory.class);
+ if (httpConnectionFactory != null)
+ {
+ HttpConfiguration httpConfiguration = httpConnectionFactory.getHttpConfiguration();
+ httpConfiguration.setUriCompliance(UriCompliance.from(
+ EnumSet.of(UriCompliance.Violation.AMBIGUOUS_PATH_SEPARATOR)
+ ));
+ }
+ }
+
+ ContextHandler fooContext = new ContextHandler();
+ fooContext.setContextPath("/foo");
+ fooContext.setHandler(new Handler.Abstract()
+ {
+ @Override
+ public boolean handle(Request request, Response response, Callback callback)
+ {
+ String pathInContext = Request.getPathInContext(request);
+ String msg = String.format("pathInContext=\"%s\"", pathInContext);
+ response.getHeaders().put(HttpHeader.CONTENT_TYPE, "text/plain;charset=utf-8");
+ Content.Sink.write(response, true, msg, callback);
+ return true;
+ }
+ });
+ server.setHandler(fooContext);
+ server.start();
+ String request = """
+ GET /foo/zed%2Fbar HTTP/1.1\r
+ Host: local\r
+ Connection: close\r
+ \r
+ """;
+ HttpTester.Response response = HttpTester.parseResponse(connector.getResponse(request));
+ assertEquals(HttpStatus.OK_200, response.getStatus());
+ assertThat(response.getContent(), is("pathInContext=\"/zed%2Fbar\""));
+ }
+
@Test
public void testConnectRequestURLSameAsHost() throws Exception
{
diff --git a/jetty-core/pom.xml b/jetty-core/pom.xml
index 97f9ff5401c3..c5f629994c1e 100644
--- a/jetty-core/pom.xml
+++ b/jetty-core/pom.xml
@@ -28,6 +28,7 @@
jetty-jmx
jetty-jndi
jetty-keystore
+ jetty-maven
jetty-openid
jetty-osgi
jetty-plus
diff --git a/jetty-ee10/jetty-ee10-maven-plugin/pom.xml b/jetty-ee10/jetty-ee10-maven-plugin/pom.xml
index b86cc5b7d503..2d4ed9fe4cb0 100644
--- a/jetty-ee10/jetty-ee10-maven-plugin/pom.xml
+++ b/jetty-ee10/jetty-ee10-maven-plugin/pom.xml
@@ -81,6 +81,11 @@
jetty-jndi
true
+
+ org.eclipse.jetty
+ jetty-maven
+ true
+
org.eclipse.jetty
jetty-security
diff --git a/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-cdi-start-forked/src/main/jetty/jetty.xml b/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-cdi-start-forked/src/main/jetty/jetty.xml
index e2575774e666..8a8f26b49f4f 100644
--- a/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-cdi-start-forked/src/main/jetty/jetty.xml
+++ b/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-cdi-start-forked/src/main/jetty/jetty.xml
@@ -26,7 +26,7 @@
-
+
diff --git a/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-combinedresource-it/src/config/jetty.xml b/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-combinedresource-it/src/config/jetty.xml
index 445b59619142..343f5e7f99b1 100644
--- a/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-combinedresource-it/src/config/jetty.xml
+++ b/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-combinedresource-it/src/config/jetty.xml
@@ -26,7 +26,7 @@
-
+
diff --git a/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-maven-plugin-provided-module-dep/web/src/config/jetty.xml b/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-maven-plugin-provided-module-dep/web/src/config/jetty.xml
index 0a3a743a2c46..ef0c9bcad939 100644
--- a/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-maven-plugin-provided-module-dep/web/src/config/jetty.xml
+++ b/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-maven-plugin-provided-module-dep/web/src/config/jetty.xml
@@ -32,7 +32,7 @@
-
+
diff --git a/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-run-mojo-jar-scan-it/MyWebApp/src/config/jetty.xml b/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-run-mojo-jar-scan-it/MyWebApp/src/config/jetty.xml
index 657264f32231..58c5b2751216 100644
--- a/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-run-mojo-jar-scan-it/MyWebApp/src/config/jetty.xml
+++ b/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-run-mojo-jar-scan-it/MyWebApp/src/config/jetty.xml
@@ -25,7 +25,7 @@
-
+
diff --git a/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-start-distro-mojo-it/jetty-simple-webapp/src/base/etc/test-jetty-ee10.xml b/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-start-distro-mojo-it/jetty-simple-webapp/src/base/etc/test-jetty-ee10.xml
index 6ba1c7f8e1f1..9857cb546ef7 100644
--- a/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-start-distro-mojo-it/jetty-simple-webapp/src/base/etc/test-jetty-ee10.xml
+++ b/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-start-distro-mojo-it/jetty-simple-webapp/src/base/etc/test-jetty-ee10.xml
@@ -5,7 +5,7 @@
[
-
+
diff --git a/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-start-forked-mojo-it/jetty-simple-webapp/src/config/jetty.xml b/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-start-forked-mojo-it/jetty-simple-webapp/src/config/jetty.xml
index 445b59619142..343f5e7f99b1 100644
--- a/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-start-forked-mojo-it/jetty-simple-webapp/src/config/jetty.xml
+++ b/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-start-forked-mojo-it/jetty-simple-webapp/src/config/jetty.xml
@@ -26,7 +26,7 @@
-
+
diff --git a/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-start-gwt-it/beer-server/src/config/jetty.xml b/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-start-gwt-it/beer-server/src/config/jetty.xml
index 445b59619142..343f5e7f99b1 100644
--- a/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-start-gwt-it/beer-server/src/config/jetty.xml
+++ b/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-start-gwt-it/beer-server/src/config/jetty.xml
@@ -26,7 +26,7 @@
-
+
diff --git a/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/pom.xml b/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/pom.xml
index 94254ab8f283..521f49c0d94e 100644
--- a/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/pom.xml
+++ b/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/pom.xml
@@ -112,7 +112,7 @@
-
+
${basedir}/src/config/login.xml
diff --git a/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/config/jetty.xml b/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/config/jetty.xml
index 445b59619142..343f5e7f99b1 100644
--- a/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/config/jetty.xml
+++ b/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/config/jetty.xml
@@ -26,7 +26,7 @@
-
+
diff --git a/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-start-mojo-multi-module-single-war-it/webapp-war/src/config/jetty.xml b/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-start-mojo-multi-module-single-war-it/webapp-war/src/config/jetty.xml
index 445b59619142..343f5e7f99b1 100644
--- a/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-start-mojo-multi-module-single-war-it/webapp-war/src/config/jetty.xml
+++ b/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-start-mojo-multi-module-single-war-it/webapp-war/src/config/jetty.xml
@@ -26,7 +26,7 @@
-
+
diff --git a/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-start-overlay-it/jetty-simple-webapp/src/config/jetty.xml b/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-start-overlay-it/jetty-simple-webapp/src/config/jetty.xml
index 445b59619142..343f5e7f99b1 100644
--- a/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-start-overlay-it/jetty-simple-webapp/src/config/jetty.xml
+++ b/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-start-overlay-it/jetty-simple-webapp/src/config/jetty.xml
@@ -26,7 +26,7 @@
-
+
diff --git a/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-start-war-distro-mojo-it/jetty-simple-webapp/src/base/etc/test-jetty-ee10.xml b/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-start-war-distro-mojo-it/jetty-simple-webapp/src/base/etc/test-jetty-ee10.xml
index 6ba1c7f8e1f1..9857cb546ef7 100644
--- a/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-start-war-distro-mojo-it/jetty-simple-webapp/src/base/etc/test-jetty-ee10.xml
+++ b/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-start-war-distro-mojo-it/jetty-simple-webapp/src/base/etc/test-jetty-ee10.xml
@@ -5,7 +5,7 @@
][
-
+
diff --git a/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-start-war-forked-mojo-it/jetty-simple-webapp/src/config/jetty.xml b/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-start-war-forked-mojo-it/jetty-simple-webapp/src/config/jetty.xml
index 445b59619142..343f5e7f99b1 100644
--- a/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-start-war-forked-mojo-it/jetty-simple-webapp/src/config/jetty.xml
+++ b/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-start-war-forked-mojo-it/jetty-simple-webapp/src/config/jetty.xml
@@ -26,7 +26,7 @@
-
+
diff --git a/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-start-war-mojo-it/src/config/jetty.xml b/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-start-war-mojo-it/src/config/jetty.xml
index 445b59619142..343f5e7f99b1 100644
--- a/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-start-war-mojo-it/src/config/jetty.xml
+++ b/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-start-war-mojo-it/src/config/jetty.xml
@@ -26,7 +26,7 @@
-
+
diff --git a/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/AbstractForker.java b/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/AbstractForker.java
deleted file mode 100644
index 690611f84a71..000000000000
--- a/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/AbstractForker.java
+++ /dev/null
@@ -1,251 +0,0 @@
-//
-// ========================================================================
-// Copyright (c) 1995 Mort Bay Consulting Pty Ltd and others.
-//
-// This program and the accompanying materials are made available under the
-// terms of the Eclipse Public License v. 2.0 which is available at
-// https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
-// which is available at https://www.apache.org/licenses/LICENSE-2.0.
-//
-// SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
-// ========================================================================
-//
-
-package org.eclipse.jetty.ee10.maven.plugin;
-
-import java.io.File;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.jetty.util.component.AbstractLifeCycle;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * AbstractForker
- *
- * Base class for forking jetty.
- */
-public abstract class AbstractForker extends AbstractLifeCycle
-{
- private static final Logger LOG = LoggerFactory.getLogger(AbstractForker.class);
-
- protected Map env;
-
- protected String jvmArgs;
-
- protected boolean exitVm;
-
- protected boolean stopAtShutdown;
-
- protected List jettyXmlFiles;
-
- protected Map jettyProperties;
-
- protected int stopPort;
-
- protected String stopKey;
-
- protected File jettyOutputFile;
-
- protected boolean waitForChild;
-
- protected int maxChildStartChecks = 10; //check up to 10 times for child to start
-
- protected long maxChildStartCheckMs = 200; //wait 200ms between checks
-
- protected File tokenFile;
-
- protected File workDir;
-
- protected Map systemProperties;
-
- protected abstract ProcessBuilder createCommand();
-
- protected abstract void redeployWebApp() throws Exception;
-
- public File getWorkDir()
- {
- return workDir;
- }
-
- public void setWorkDir(File workDir)
- {
- this.workDir = workDir;
- }
-
- /**
- * @return the systemProperties
- */
- public Map getSystemProperties()
- {
- return systemProperties;
- }
-
- /**
- * Set the systemProperties to set.
- * @param systemProperties the systemProperties to set
- */
- public void setSystemProperties(Map systemProperties)
- {
- this.systemProperties = systemProperties;
- }
-
- public Map getEnv()
- {
- return env;
- }
-
- public void setEnv(Map env)
- {
- this.env = env;
- }
-
- public String getJvmArgs()
- {
- return jvmArgs;
- }
-
- public void setJvmArgs(String jvmArgs)
- {
- this.jvmArgs = jvmArgs;
- }
-
- public boolean isExitVm()
- {
- return exitVm;
- }
-
- public void setExitVm(boolean exitVm)
- {
- this.exitVm = exitVm;
- }
-
- public boolean isStopAtShutdown()
- {
- return stopAtShutdown;
- }
-
- public void setStopAtShutdown(boolean stopAtShutdown)
- {
- this.stopAtShutdown = stopAtShutdown;
- }
-
- public List getJettyXmlFiles()
- {
- return jettyXmlFiles;
- }
-
- public void setJettyXmlFiles(List jettyXmlFiles)
- {
- this.jettyXmlFiles = jettyXmlFiles;
- }
-
- public Map getJettyProperties()
- {
- return jettyProperties;
- }
-
- public void setJettyProperties(Map jettyProperties)
- {
- this.jettyProperties = jettyProperties;
- }
-
- public int getStopPort()
- {
- return stopPort;
- }
-
- public void setStopPort(int stopPort)
- {
- this.stopPort = stopPort;
- }
-
- public String getStopKey()
- {
- return stopKey;
- }
-
- public void setStopKey(String stopKey)
- {
- this.stopKey = stopKey;
- }
-
- public File getJettyOutputFile()
- {
- return jettyOutputFile;
- }
-
- public void setJettyOutputFile(File jettyOutputFile)
- {
- this.jettyOutputFile = jettyOutputFile;
- }
-
- public boolean isWaitForChild()
- {
- return waitForChild;
- }
-
- public void setWaitForChild(boolean waitForChild)
- {
- this.waitForChild = waitForChild;
- }
-
- public int getMaxChildtartChecks()
- {
- return maxChildStartChecks;
- }
-
- public void setMaxChildStartChecks(int maxChildStartChecks)
- {
- this.maxChildStartChecks = maxChildStartChecks;
- }
-
- public long getMaxChildStartCheckMs()
- {
- return maxChildStartCheckMs;
- }
-
- public void setMaxChildStartCheckMs(long maxChildStartCheckMs)
- {
- this.maxChildStartCheckMs = maxChildStartCheckMs;
- }
-
- public File getTokenFile()
- {
- return tokenFile;
- }
-
- public void setTokenFile(File tokenFile)
- {
- this.tokenFile = tokenFile;
- }
-
- public void doStart()
- throws Exception
- {
- super.doStart();
-
- //Create the command to fork
- ProcessBuilder command = createCommand();
- Process process = command.start();
-
- if (waitForChild)
- {
- //keep executing until the child dies
- process.waitFor();
- }
- else
- {
- //just wait until the child has started successfully
- int attempts = maxChildStartChecks;
- while (!tokenFile.exists() && attempts > 0)
- {
- Thread.sleep(maxChildStartCheckMs);
- --attempts;
- }
- if (attempts <= 0)
- LOG.info("Couldn't verify success of child startup");
- }
- }
-}
diff --git a/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/AbstractUnassembledWebAppMojo.java b/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/AbstractUnassembledWebAppMojo.java
index 2d44726d9503..7e5683fd16e5 100644
--- a/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/AbstractUnassembledWebAppMojo.java
+++ b/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/AbstractUnassembledWebAppMojo.java
@@ -24,6 +24,7 @@
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugins.annotations.Parameter;
+import org.eclipse.jetty.maven.ScanPattern;
import org.eclipse.jetty.util.resource.Resource;
import org.eclipse.jetty.util.resource.Resources;
@@ -123,7 +124,7 @@ protected void configureWebApp() throws Exception
*
* @throws IOException if there is an IO problem
*/
- protected void configureUnassembledWebApp() throws IOException
+ protected void configureUnassembledWebApp() throws Exception
{
//Set up the location of the webapp.
//There are 2 parts to this: setWar() and setBaseResource(). On standalone jetty,
@@ -208,7 +209,7 @@ protected void configureUnassembledWebApp() throws IOException
//process any overlays and the war type artifacts, and
//sets up the base resource collection for the webapp
- mavenProjectHelper.getOverlayManager().applyOverlays(webApp);
+ mavenProjectHelper.getOverlayManager().applyOverlays(webApp, webApp.getBaseAppFirst());
getLog().info("web.xml file = " + webApp.getDescriptor());
getLog().info("Webapp directory = " + webAppSourceDirectory.getCanonicalPath());
diff --git a/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/AbstractWebAppMojo.java b/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/AbstractWebAppMojo.java
index cbc4b1fb59ff..de3eefc0bbdf 100644
--- a/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/AbstractWebAppMojo.java
+++ b/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/AbstractWebAppMojo.java
@@ -48,7 +48,10 @@
import org.apache.maven.project.MavenProject;
import org.codehaus.plexus.util.StringUtils;
import org.eclipse.aether.RepositorySystem;
-import org.eclipse.jetty.ee10.maven.plugin.utils.MavenProjectHelper;
+import org.eclipse.jetty.maven.MavenProjectHelper;
+import org.eclipse.jetty.maven.MavenServerConnector;
+import org.eclipse.jetty.maven.PluginLog;
+import org.eclipse.jetty.maven.ScanTargetPattern;
import org.eclipse.jetty.security.LoginService;
import org.eclipse.jetty.server.RequestLog;
import org.eclipse.jetty.server.Server;
@@ -563,7 +566,7 @@ protected JettyHomeForker newJettyHomeForker()
if (jettyHome == null)
jetty.setJettyHomeZip(jettyHomeZip != null ? jettyHomeZip : mavenProjectHelper.resolveArtifact(JETTY_HOME_GROUPID, JETTY_HOME_ARTIFACTID, plugin.getVersion(), "zip"));
- jetty.version = plugin.getVersion();
+ jetty.setVersion(plugin.getVersion());
jetty.setJettyHome(jettyHome);
jetty.setJettyBase(jettyBase);
jetty.setBaseDir(target);
diff --git a/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/ConsoleReader.java b/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/ConsoleReader.java
deleted file mode 100644
index 298f434e2e91..000000000000
--- a/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/ConsoleReader.java
+++ /dev/null
@@ -1,66 +0,0 @@
-//
-// ========================================================================
-// Copyright (c) 1995 Mort Bay Consulting Pty Ltd and others.
-//
-// This program and the accompanying materials are made available under the
-// terms of the Eclipse Public License v. 2.0 which is available at
-// https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
-// which is available at https://www.apache.org/licenses/LICENSE-2.0.
-//
-// SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
-// ========================================================================
-//
-
-package org.eclipse.jetty.ee10.maven.plugin;
-
-import java.io.Console;
-import java.util.EventListener;
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- * ConsoleReader
- *
- * Reads lines from the System console and supplies them
- * to ConsoleReader.Listeners.
- */
-public class ConsoleReader implements Runnable
-{
- public interface Listener extends EventListener
- {
- public void consoleEvent(String line);
- }
-
- public Set listeners = new HashSet<>();
-
- public void addListener(ConsoleReader.Listener listener)
- {
- listeners.add(listener);
- }
-
- public void removeListener(ConsoleReader.Listener listener)
- {
- listeners.remove(listener);
- }
-
- public void run()
- {
- Console console = System.console();
- if (console == null)
- return;
-
- String line = "";
- while (true && line != null)
- {
- line = console.readLine("%nHit to redeploy:%n%n");
- if (line != null)
- signalEvent(line);
- }
- }
-
- private void signalEvent(String line)
- {
- for (ConsoleReader.Listener l:listeners)
- l.consoleEvent(line);
- }
-}
diff --git a/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/JettyEmbedder.java b/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/JettyEmbedder.java
index 95e61c06b5a9..948e556a0ca1 100644
--- a/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/JettyEmbedder.java
+++ b/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/JettyEmbedder.java
@@ -13,220 +13,40 @@
package org.eclipse.jetty.ee10.maven.plugin;
-import java.io.File;
import java.nio.file.Files;
import java.nio.file.Path;
-import java.util.ArrayList;
import java.util.List;
-import java.util.Map;
-import java.util.Properties;
import org.eclipse.jetty.ee10.quickstart.QuickStartConfiguration;
import org.eclipse.jetty.ee10.quickstart.QuickStartConfiguration.Mode;
import org.eclipse.jetty.ee10.servlet.ServletHandler;
-import org.eclipse.jetty.security.LoginService;
-import org.eclipse.jetty.server.RequestLog;
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.server.ShutdownMonitor;
+import org.eclipse.jetty.ee10.webapp.Configurations;
+import org.eclipse.jetty.maven.AbstractJettyEmbedder;
+import org.eclipse.jetty.maven.ServerSupport;
import org.eclipse.jetty.server.handler.ContextHandler;
-import org.eclipse.jetty.util.component.AbstractLifeCycle;
/**
- * JettyEmbedded
+ * JettyEmbedder
*
* Starts jetty within the current process.
*/
-public class JettyEmbedder extends AbstractLifeCycle
+public class JettyEmbedder extends AbstractJettyEmbedder
{
- protected List contextHandlers;
- protected List loginServices;
- protected RequestLog requestLog;
- protected MavenServerConnector httpConnector;
- protected Server server;
protected MavenWebAppContext webApp;
- protected boolean exitVm;
- protected boolean stopAtShutdown;
- protected List jettyXmlFiles;
- protected Map jettyProperties;
- protected ShutdownMonitor shutdownMonitor;
- protected int stopPort;
- protected String stopKey;
- private String contextXml;
- private Properties webAppProperties;
public List getContextHandlers()
{
return contextHandlers;
}
-
- public void setContextHandlers(List contextHandlers)
- {
- if (contextHandlers == null)
- this.contextHandlers = null;
- else
- this.contextHandlers = new ArrayList<>(contextHandlers);
- }
-
- public List getLoginServices()
- {
- return loginServices;
- }
-
- public void setLoginServices(List loginServices)
- {
- if (loginServices == null)
- this.loginServices = null;
- else
- this.loginServices = new ArrayList<>(loginServices);
- }
-
- public RequestLog getRequestLog()
- {
- return requestLog;
- }
-
- public void setRequestLog(RequestLog requestLog)
- {
- this.requestLog = requestLog;
- }
-
- public MavenServerConnector getHttpConnector()
- {
- return httpConnector;
- }
-
- public void setHttpConnector(MavenServerConnector httpConnector)
- {
- this.httpConnector = httpConnector;
- }
-
- public Server getServer()
- {
- return server;
- }
-
- public void setServer(Server server)
- {
- this.server = server;
- }
-
- public MavenWebAppContext getWebApp()
- {
- return webApp;
- }
-
- public boolean isExitVm()
- {
- return exitVm;
- }
-
- public void setExitVm(boolean exitVm)
- {
- this.exitVm = exitVm;
- }
-
- public boolean isStopAtShutdown()
- {
- return stopAtShutdown;
- }
-
- public void setStopAtShutdown(boolean stopAtShutdown)
- {
- this.stopAtShutdown = stopAtShutdown;
- }
-
- public List getJettyXmlFiles()
- {
- return jettyXmlFiles;
- }
-
- public void setJettyXmlFiles(List jettyXmlFiles)
- {
- this.jettyXmlFiles = jettyXmlFiles;
- }
-
- public Map getJettyProperties()
- {
- return jettyProperties;
- }
-
- public void setJettyProperties(Map jettyProperties)
- {
- this.jettyProperties = jettyProperties;
- }
-
- public ShutdownMonitor getShutdownMonitor()
- {
- return shutdownMonitor;
- }
-
- public void setShutdownMonitor(ShutdownMonitor shutdownMonitor)
- {
- this.shutdownMonitor = shutdownMonitor;
- }
-
- public int getStopPort()
- {
- return stopPort;
- }
-
- public void setStopPort(int stopPort)
- {
- this.stopPort = stopPort;
- }
-
- public String getStopKey()
- {
- return stopKey;
- }
-
- public void setStopKey(String stopKey)
- {
- this.stopKey = stopKey;
- }
public void setWebApp(MavenWebAppContext app)
{
webApp = app;
}
- public void setWebAppProperties(Properties props)
- {
- if (webAppProperties != null)
- webAppProperties.clear();
-
- if (props != null)
- {
- if (webAppProperties == null)
- webAppProperties = new Properties();
-
- webAppProperties.putAll(props);
- }
- }
-
- public String getContextXml()
- {
- return contextXml;
- }
-
- public void setContextXml(String contextXml)
- {
- this.contextXml = contextXml;
- }
-
- public void doStart() throws Exception
- {
- super.doStart();
-
- configure();
- configureShutdownMonitor();
- server.start();
- }
-
protected void redeployWebApp() throws Exception
{
- if (!webApp.isStopped())
- webApp.stop();
+ stopWebApp();
//clear the ServletHandler, which may have
//remembered "durable" Servlets, Filters, Listeners
@@ -239,40 +59,22 @@ protected void redeployWebApp() throws Exception
webApp.start();
}
-
- protected void join() throws InterruptedException
+
+ @Override
+ public void stopWebApp() throws Exception
{
- server.join();
+ if (webApp != null && !webApp.isStopped())
+ webApp.stop();
}
/**
- * Configure the server and the webapp
+ * Configure the webapp
* @throws Exception if there is an unspecified problem
*/
- private void configure() throws Exception
+ public void configureWebApp() throws Exception
{
- // apply any configs from jetty.xml files first
- Server tmp = ServerSupport.applyXmlConfigurations(new Server(), jettyXmlFiles, jettyProperties);
-
- if (tmp != null)
- server = tmp;
-
- server.setStopAtShutdown(stopAtShutdown);
-
- //ensure there's a connector
- if (httpConnector != null)
- httpConnector.setServer(server);
-
- ServerSupport.configureConnectors(server, httpConnector, jettyProperties);
-
- //set up handler structure
- ServerSupport.configureHandlers(server, contextHandlers, requestLog);
-
//Set up list of default Configurations to apply to a webapp
- ServerSupport.configureDefaultConfigurationClasses(server);
-
- // set up security realms
- ServerSupport.configureLoginServices(server, loginServices);
+ Configurations.setServerDefault(server);
/* Configure the webapp */
if (webApp == null)
@@ -286,37 +88,22 @@ private void configure() throws Exception
Path qs = webApp.getTempDirectory().toPath().resolve("quickstart-web.xml");
if (Files.exists(qs) && Files.isRegularFile(qs))
{
- webApp.setAttribute(QuickStartConfiguration.QUICKSTART_WEB_XML, qs);
webApp.addConfiguration(new MavenQuickStartConfiguration());
+ webApp.setAttribute(QuickStartConfiguration.QUICKSTART_WEB_XML, qs);
webApp.setAttribute(QuickStartConfiguration.MODE, Mode.QUICKSTART);
}
}
-
- //add the webapp to the server
- ServerSupport.addWebApplication(server, webApp);
}
-
- private void applyWebAppProperties() throws Exception
- {
- //apply properties to the webapp if there are any
- if (contextXml != null)
- {
- if (webAppProperties == null)
- webAppProperties = new Properties();
- webAppProperties.put("context.xml", contextXml);
- }
- WebAppPropertyConverter.fromProperties(webApp, webAppProperties, server, jettyProperties);
+ public void applyWebAppProperties() throws Exception
+ {
+ super.applyWebAppProperties();
+ WebAppPropertyConverter.fromProperties(webApp, webAppProperties, server, jettyProperties);
}
-
- private void configureShutdownMonitor()
+
+ public void addWebAppToServer() throws Exception
{
- if (stopPort > 0 && stopKey != null)
- {
- ShutdownMonitor monitor = ShutdownMonitor.getInstance();
- monitor.setPort(stopPort);
- monitor.setKey(stopKey);
- monitor.setExitVm(exitVm);
- }
+ //add the webapp to the server
+ ServerSupport.addWebApplication(server, webApp);
}
}
diff --git a/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/JettyForkedChild.java b/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/JettyForkedChild.java
index f868ad600ada..7f0c6ba907ae 100644
--- a/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/JettyForkedChild.java
+++ b/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/JettyForkedChild.java
@@ -26,6 +26,8 @@
import java.util.Properties;
import java.util.Set;
+import org.eclipse.jetty.maven.AbstractForkedChild;
+import org.eclipse.jetty.maven.AbstractJettyEmbedder;
import org.eclipse.jetty.util.Scanner;
import org.eclipse.jetty.util.StringUtil;
import org.eclipse.jetty.util.component.ContainerLifeCycle;
@@ -38,174 +40,23 @@
* This is the class that is executed when the jetty maven plugin
* forks a process when DeploymentMode=FORKED.
*/
-public class JettyForkedChild extends ContainerLifeCycle
+public class JettyForkedChild extends AbstractForkedChild
{
private static final Logger LOG = LoggerFactory.getLogger(JettyForkedChild.class);
-
- protected JettyEmbedder jetty;
- protected File tokenFile; // TODO: convert to Path
- protected Scanner scanner;
- protected File webAppPropsFile; // TODO: convert to Path
- protected int scanInterval;
/**
* @param args arguments that were passed to main
* @throws Exception if unable to configure
*/
- public JettyForkedChild(String[] args)
- throws Exception
- {
- jetty = new JettyEmbedder();
- configure(args);
- }
-
- /**
- * Based on the args passed to the program, configure jetty.
- *
- * @param args args that were passed to the program.
- * @throws Exception if unable to load webprops
- */
- public void configure(String[] args)
- throws Exception
- {
- Map jettyProperties = new HashMap<>();
-
- for (int i = 0; i < args.length; i++)
- {
- //--stop-port
- if ("--stop-port".equals(args[i]))
- {
- jetty.setStopPort(Integer.parseInt(args[++i]));
- continue;
- }
-
- //--stop-key
- if ("--stop-key".equals(args[i]))
- {
- jetty.setStopKey(args[++i]);
- continue;
- }
-
- //--jettyXml
- if ("--jetty-xml".equals(args[i]))
- {
- List jettyXmls = new ArrayList<>();
- String[] names = StringUtil.csvSplit(args[++i]);
- for (int j = 0; names != null && j < names.length; j++)
- {
- jettyXmls.add(new File(names[j].trim()));
- }
- jetty.setJettyXmlFiles(jettyXmls);
- continue;
- }
- //--webprops
- if ("--webprops".equals(args[i]))
- {
- webAppPropsFile = new File(args[++i].trim());
- jetty.setWebAppProperties(loadWebAppProps());
- continue;
- }
-
- //--token
- if ("--token".equals(args[i]))
- {
- tokenFile = new File(args[++i].trim());
- continue;
- }
-
- if ("--scanInterval".equals(args[i]))
- {
- scanInterval = Integer.parseInt(args[++i].trim());
- scanner = new Scanner();
- scanner.setReportExistingFilesOnStartup(false);
- scanner.setScanInterval(scanInterval);
- scanner.addListener(new Scanner.BulkListener()
- {
- public void filesChanged(Set changes)
- {
- if (!Objects.isNull(scanner))
- {
- try
- {
- scanner.stop();
- if (!Objects.isNull(jetty.getWebApp()))
- {
- //stop the webapp
- jetty.getWebApp().stop();
- //reload the props
- jetty.setWebAppProperties(loadWebAppProps());
- jetty.setWebApp(jetty.getWebApp());
- //restart the webapp
- jetty.redeployWebApp();
-
- //restart the scanner
- scanner.start();
- }
- }
- catch (Exception e)
- {
- LOG.error("Error reconfiguring/restarting webapp after change in watched files", e);
- }
- }
- }
- });
-
- if (!Objects.isNull(webAppPropsFile))
- scanner.addFile(webAppPropsFile.toPath());
- continue;
- }
-
- //assume everything else is a jetty property to be passed in
- String[] tmp = args[i].trim().split("=");
- if (tmp.length == 2)
- {
- jettyProperties.put(tmp[0], tmp[1]);
- }
- }
-
- jetty.setJettyProperties(jettyProperties);
- jetty.setExitVm(true);
- }
-
- /**
- * Load properties from a file describing the webapp if one is
- * present.
- *
- * @return file contents as properties
- * @throws IOException if there is an IO problem
- */
- private Properties loadWebAppProps() throws IOException
+ public JettyForkedChild(String[] args) throws Exception
{
- Properties props = new Properties();
- if (Objects.nonNull(webAppPropsFile))
- props.load(new FileInputStream(webAppPropsFile));
- return props;
+ super(args);
}
- /**
- * Start a jetty instance and webapp. This thread will
- * wait until jetty exits.
- */
- public void doStart()
- throws Exception
+ @Override
+ protected AbstractJettyEmbedder newJettyEmbedder()
{
- super.doStart();
-
- //Start the embedded jetty instance
- jetty.start();
-
- //touch file to signify start of jetty
- Path tokenPath = tokenFile.toPath();
- Files.createFile(tokenPath);
-
- //Start a watcher on a file that will change if the
- //webapp is regenerated; stop the webapp, apply the
- //properties and restart it.
- if (scanner != null)
- scanner.start();
-
- //wait for jetty to finish
- jetty.join();
+ return new JettyEmbedder();
}
public static void main(String[] args)
diff --git a/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/JettyForker.java b/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/JettyForker.java
index e43637f1a1f2..6fb99d624ce7 100644
--- a/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/JettyForker.java
+++ b/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/JettyForker.java
@@ -13,94 +13,21 @@
package org.eclipse.jetty.ee10.maven.plugin;
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.maven.AbstractServerForker;
/**
* JettyForker
*
* Uses quickstart to generate a webapp and forks a process to run it.
*/
-public class JettyForker extends AbstractForker
+public class JettyForker extends AbstractServerForker
{
- protected File forkWebXml;
- protected Server server;
protected MavenWebAppContext webApp;
- protected String containerClassPath;
- protected File webAppPropsFile;
- protected String contextXml;
- protected int scanInterval;
QuickStartGenerator generator;
- /**
- * @return the scan
- */
- public boolean isScan()
- {
- return scanInterval > 0;
- }
-
- /**
- * Set if true, the forked child will scan for changes at 1 second intervals.
- * @param scan if true, the forked child will scan for changes at 1 second intervals
- */
- public void setScan(boolean scan)
- {
- setScanInterval(scan ? 1 : 0);
- }
-
- public void setScanInterval(int sec)
- {
- scanInterval = sec;
- }
-
- public int getScanInterval()
- {
- return scanInterval;
- }
-
- public File getWebAppPropsFile()
- {
- return webAppPropsFile;
- }
-
- public void setWebAppPropsFile(File webAppPropsFile)
- {
- this.webAppPropsFile = webAppPropsFile;
- }
-
- public File getForkWebXml()
- {
- return forkWebXml;
- }
-
- public void setForkWebXml(File forkWebXml)
- {
- this.forkWebXml = forkWebXml;
- }
-
- public String getContextXml()
- {
- return contextXml;
- }
-
- public void setContextXml(String contextXml)
- {
- this.contextXml = contextXml;
- }
-
- public String getContainerClassPath()
- {
- return containerClassPath;
- }
-
- public void setContainerClassPath(String containerClassPath)
+ public JettyForker()
{
- this.containerClassPath = containerClassPath;
+ executionClassName = JettyForkedChild.class.getCanonicalName();
}
public void setWebApp(MavenWebAppContext app)
@@ -108,19 +35,8 @@ public void setWebApp(MavenWebAppContext app)
webApp = app;
}
- public Server getServer()
- {
- return server;
- }
-
- public void setServer(Server server)
- {
- this.server = server;
- }
-
@Override
- public void doStart()
- throws Exception
+ public void generateWebApp() throws Exception
{
//Run the webapp to create the quickstart file and properties file
generator = new QuickStartGenerator(forkWebXml.toPath(), webApp);
@@ -128,8 +44,6 @@ public void doStart()
generator.setWebAppProps(webAppPropsFile.toPath());
generator.setServer(server);
generator.generate();
-
- super.doStart();
}
protected void redeployWebApp()
@@ -139,154 +53,4 @@ protected void redeployWebApp()
//which will redeploy the webapp
generator.generate();
}
-
- public ProcessBuilder createCommand()
- {
- List cmd = new ArrayList();
- cmd.add(getJavaBin());
-
- if (jvmArgs != null)
- {
- String[] args = jvmArgs.split(" ");
- for (int i = 0; args != null && i < args.length; i++)
- {
- if (args[i] != null && !"".equals(args[i]))
- cmd.add(args[i].trim());
- }
- }
-
- if (systemProperties != null)
- {
- for (Map.Entry e:systemProperties.entrySet())
- {
- cmd.add("-D" + e.getKey() + "=" + e.getValue());
- }
- }
-
- if (containerClassPath != null && containerClassPath.length() > 0)
- {
- cmd.add("-cp");
- cmd.add(containerClassPath);
- }
-
- cmd.add(JettyForkedChild.class.getCanonicalName());
-
- if (stopPort > 0 && stopKey != null)
- {
- cmd.add("--stop-port");
- cmd.add(Integer.toString(stopPort));
- cmd.add("--stop-key");
- cmd.add(stopKey);
- }
- if (jettyXmlFiles != null)
- {
- cmd.add("--jetty-xml");
- StringBuilder tmp = new StringBuilder();
- for (File jettyXml:jettyXmlFiles)
- {
- if (tmp.length() != 0)
- tmp.append(",");
- tmp.append(jettyXml.getAbsolutePath());
- }
- cmd.add(tmp.toString());
- }
-
- cmd.add("--webprops");
- cmd.add(webAppPropsFile.getAbsolutePath());
-
- cmd.add("--token");
- cmd.add(tokenFile.getAbsolutePath());
-
- if (scanInterval > 0)
- {
- cmd.add("--scanInterval");
- cmd.add(Integer.toString(scanInterval));
- }
-
- if (jettyProperties != null)
- {
- for (Map.Entry e:jettyProperties.entrySet())
- {
- cmd.add(e.getKey() + "=" + e.getValue());
- }
- }
-
- ProcessBuilder command = new ProcessBuilder(cmd);
- command.directory(workDir);
-
- if (PluginLog.getLog().isDebugEnabled())
- PluginLog.getLog().debug("Forked cli:" + command.command());
-
- PluginLog.getLog().info("Forked process starting");
-
- //set up extra environment vars if there are any
- if (env != null && !env.isEmpty())
- command.environment().putAll(env);
-
- if (waitForChild)
- {
- command.inheritIO();
- }
- else
- {
- command.redirectOutput(jettyOutputFile);
- command.redirectErrorStream(true);
- }
- return command;
- }
-
- /**
- * Get the location of the java binary.
- * @return the location of the java binary
- */
- private String getJavaBin()
- {
- String[] javaexes = new String[]{"java", "java.exe"};
-
- File javaHomeDir = new File(System.getProperty("java.home"));
- for (String javaexe : javaexes)
- {
- File javabin = new File(javaHomeDir, fileSeparators("bin/" + javaexe));
- if (javabin.exists() && javabin.isFile())
- {
- return javabin.getAbsolutePath();
- }
- }
-
- return "java";
- }
-
- public static String fileSeparators(String path)
- {
- StringBuilder ret = new StringBuilder();
- for (char c : path.toCharArray())
- {
- if ((c == '/') || (c == '\\'))
- {
- ret.append(File.separatorChar);
- }
- else
- {
- ret.append(c);
- }
- }
- return ret.toString();
- }
-
- public static String pathSeparators(String path)
- {
- StringBuilder ret = new StringBuilder();
- for (char c : path.toCharArray())
- {
- if ((c == ',') || (c == ':'))
- {
- ret.append(File.pathSeparatorChar);
- }
- else
- {
- ret.append(c);
- }
- }
- return ret.toString();
- }
}
diff --git a/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/JettyHomeForker.java b/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/JettyHomeForker.java
index 2d988f8a21b1..7bac2f086b22 100644
--- a/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/JettyHomeForker.java
+++ b/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/JettyHomeForker.java
@@ -14,30 +14,8 @@
package org.eclipse.jetty.ee10.maven.plugin;
import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URI;
-import java.nio.file.FileAlreadyExistsException;
-import java.nio.file.FileSystems;
-import java.nio.file.FileVisitOption;
-import java.nio.file.FileVisitResult;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.SimpleFileVisitor;
-import java.nio.file.attribute.BasicFileAttributes;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.EnumSet;
-import java.util.List;
-import java.util.Map;
-import org.eclipse.jetty.util.IO;
-import org.eclipse.jetty.util.StringUtil;
-import org.eclipse.jetty.util.TypeUtil;
-import org.eclipse.jetty.util.resource.Resource;
-import org.eclipse.jetty.util.resource.ResourceFactory;
+import org.eclipse.jetty.maven.AbstractHomeForker;
/**
* JettyHomeBaseForker
@@ -45,121 +23,13 @@
* Unpacks a jetty-home and configures it with a base that allows it
* to run an unassembled webapp.
*/
-public class JettyHomeForker extends AbstractForker
+public class JettyHomeForker extends AbstractHomeForker
{
protected MavenWebAppContext webApp;
- protected String contextXml;
-
- /**
- * Location of existing jetty home directory
- */
- protected File jettyHome;
-
- /**
- * Zip of jetty-home
- */
- protected File jettyHomeZip;
-
- /**
- * Location of existing jetty base directory
- */
- protected File jettyBase;
-
- protected File baseDir;
-
- /**
- * Optional list of other modules to
- * activate.
- */
- protected String[] modules;
-
- /*
- * Optional jetty commands
- */
- protected String jettyOptions;
-
- protected List libExtJarFiles;
- protected Path modulesPath;
- protected Path etcPath;
- protected Path libPath;
- protected Path webappPath;
- protected Path mavenLibPath;
- protected String version;
-
- public void setJettyOptions(String jettyOptions)
- {
- this.jettyOptions = jettyOptions;
- }
-
- public String getJettyOptions()
+ public JettyHomeForker()
{
- return jettyOptions;
- }
-
- public List getLibExtJarFiles()
- {
- return libExtJarFiles;
- }
-
- public void setLibExtJarFiles(List libExtJarFiles)
- {
- this.libExtJarFiles = libExtJarFiles;
- }
-
- public File getJettyHome()
- {
- return jettyHome;
- }
-
- public void setJettyHome(File jettyHome)
- {
- this.jettyHome = jettyHome;
- }
-
- public File getJettyBase()
- {
- return jettyBase;
- }
-
- public void setJettyBase(File jettyBase)
- {
- this.jettyBase = jettyBase;
- }
-
- public String[] getModules()
- {
- return modules;
- }
-
- public void setModules(String[] modules)
- {
- this.modules = modules;
- }
-
- public String getContextXmlFile()
- {
- return contextXml;
- }
-
- public void setContextXml(String contextXml)
- {
- this.contextXml = contextXml;
- }
-
- public File getJettyHomeZip()
- {
- return jettyHomeZip;
- }
-
- public void setJettyHomeZip(File jettyHomeZip)
- {
- this.jettyHomeZip = jettyHomeZip;
- }
-
- public MavenWebAppContext getWebApp()
- {
- return webApp;
+ environment = "ee10";
}
public void setWebApp(MavenWebAppContext webApp)
@@ -177,106 +47,6 @@ public void setBaseDir(File baseDir)
this.baseDir = baseDir;
}
- @Override
- protected ProcessBuilder createCommand()
- {
- List cmd = new ArrayList<>();
- cmd.add("java");
-
- //add any args to the jvm
- if (StringUtil.isNotBlank(jvmArgs))
- {
- Arrays.stream(jvmArgs.split(" ")).filter(StringUtil::isNotBlank).forEach((a) -> cmd.add(a.trim()));
- }
-
- cmd.add("-jar");
- cmd.add(new File(jettyHome, "start.jar").getAbsolutePath());
-
- if (systemProperties != null)
- {
- for (Map.Entry e : systemProperties.entrySet())
- {
- cmd.add("-D" + e.getKey() + "=" + e.getValue());
- }
- }
-
- cmd.add("-DSTOP.PORT=" + stopPort);
- if (stopKey != null)
- cmd.add("-DSTOP.KEY=" + stopKey);
-
- //set up enabled jetty modules
- StringBuilder tmp = new StringBuilder();
- tmp.append("--module=");
- tmp.append("server,http,ee10-webapp,ee10-deploy");
- if (modules != null)
- {
- for (String m : modules)
- {
- if (tmp.indexOf(m) < 0)
- tmp.append("," + m);
- }
- }
-
- if (libExtJarFiles != null && !libExtJarFiles.isEmpty() && tmp.indexOf("ext") < 0)
- tmp.append(",ext");
- tmp.append(",ee10-maven");
- cmd.add(tmp.toString());
-
- //put any other jetty options onto the command line
- if (StringUtil.isNotBlank(jettyOptions))
- {
- Arrays.stream(jettyOptions.split(" ")).filter(StringUtil::isNotBlank).forEach((a) -> cmd.add(a.trim()));
- }
-
- //put any jetty properties onto the command line
- if (jettyProperties != null)
- {
- for (Map.Entry e : jettyProperties.entrySet())
- {
- cmd.add(e.getKey() + "=" + e.getValue());
- }
- }
-
- //existence of this file signals process started
- cmd.add("jetty.token.file=" + tokenFile.getAbsolutePath().toString());
-
- ProcessBuilder builder = new ProcessBuilder(cmd);
- builder.directory(workDir);
-
- PluginLog.getLog().info("Home process starting");
-
- //set up extra environment vars if there are any
- if (!env.isEmpty())
- builder.environment().putAll(env);
-
- if (waitForChild)
- builder.inheritIO();
- else
- {
- builder.redirectOutput(jettyOutputFile);
- builder.redirectErrorStream(true);
- }
- return builder;
- }
-
- @Override
- public void doStart() throws Exception
- {
- //set up a jetty-home
- configureJettyHome();
-
- if (jettyHome == null || !jettyHome.exists())
- throw new IllegalStateException("No jetty home");
-
- //set up a jetty-base
- configureJettyBase();
-
- //convert the webapp to properties
- generateWebAppPropertiesFile();
-
- super.doStart();
- }
-
protected void redeployWebApp()
throws Exception
{
@@ -284,142 +54,9 @@ protected void redeployWebApp()
webappPath.resolve("maven.xml").toFile().setLastModified(System.currentTimeMillis());
}
- private void generateWebAppPropertiesFile()
+ protected void generateWebAppPropertiesFile()
throws Exception
{
WebAppPropertyConverter.toProperties(webApp, etcPath.resolve("maven.props").toFile(), contextXml);
}
-
- /**
- * Create or configure a jetty base.
- */
- private void configureJettyBase() throws Exception
- {
- if (jettyBase != null && !jettyBase.exists())
- throw new IllegalStateException(jettyBase.getAbsolutePath() + " does not exist");
-
- File targetJettyBase = new File(baseDir, "jetty-base");
- Path targetBasePath = targetJettyBase.toPath();
- if (Files.exists(targetBasePath))
- IO.delete(targetJettyBase);
-
- targetJettyBase.mkdirs();
-
- //jetty-base will be the working directory for the forked command
- workDir = targetJettyBase;
-
- //if there is an existing jetty base, copy parts of it
- if (jettyBase != null)
- {
- Path jettyBasePath = jettyBase.toPath();
-
- final File contextXmlFile = (contextXml == null ? null : FileSystems.getDefault().getPath(contextXml).toFile());
-
- //copy the existing jetty base
- Files.walkFileTree(jettyBasePath, EnumSet.of(FileVisitOption.FOLLOW_LINKS), Integer.MAX_VALUE,
- new SimpleFileVisitor()
- {
- @Override
- public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException
- {
- Path targetDir = targetBasePath.resolve(jettyBasePath.relativize(dir));
- try
- {
- Files.copy(dir, targetDir);
- }
- catch (FileAlreadyExistsException e)
- {
- if (!Files.isDirectory(targetDir)) //ignore attempt to recreate dir
- throw e;
- }
- return FileVisitResult.CONTINUE;
- }
-
- @Override
- public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException
- {
- if (contextXmlFile != null && Files.isSameFile(contextXmlFile.toPath(), file))
- return FileVisitResult.CONTINUE; //skip copying the context xml file
- Files.copy(file, targetBasePath.resolve(jettyBasePath.relativize(file)));
- return FileVisitResult.CONTINUE;
- }
- });
- }
-
- //make the jetty base structure
- modulesPath = Files.createDirectories(targetBasePath.resolve("modules"));
- etcPath = Files.createDirectories(targetBasePath.resolve("etc"));
- libPath = Files.createDirectories(targetBasePath.resolve("lib"));
- webappPath = Files.createDirectories(targetBasePath.resolve("webapps"));
- mavenLibPath = Files.createDirectories(libPath.resolve("maven-ee10"));
-
- //copy in the jetty-maven-plugin jar
- URI thisJar = TypeUtil.getLocationOfClass(this.getClass());
- if (thisJar == null)
- throw new IllegalStateException("Can't find jar for jetty-ee10-maven-plugin");
-
- try (InputStream jarStream = thisJar.toURL().openStream();
- FileOutputStream fileStream = new FileOutputStream(mavenLibPath.resolve("plugin.jar").toFile()))
- {
- IO.copy(jarStream, fileStream);
- }
-
- // copy in the maven.xml webapp file
- try (InputStream mavenXmlStream = getClass().getClassLoader().getResourceAsStream("maven-ee10.xml");
- FileOutputStream fileStream = new FileOutputStream(webappPath.resolve("maven-ee10.xml").toFile()))
- {
- IO.copy(mavenXmlStream, fileStream);
- }
-
- Files.writeString(webappPath.resolve("maven-ee10.properties"), "environment=ee10");
-
- //copy in the maven.mod file
- try (InputStream mavenModStream = getClass().getClassLoader().getResourceAsStream("ee10-maven.mod");
- FileOutputStream fileStream = new FileOutputStream(modulesPath.resolve("ee10-maven.mod").toFile()))
- {
- IO.copy(mavenModStream, fileStream);
- }
-
- //copy in the jetty-maven.xml file
- try (InputStream jettyMavenStream = getClass().getClassLoader().getResourceAsStream("jetty-ee10-maven.xml");
- FileOutputStream fileStream = new FileOutputStream(etcPath.resolve("jetty-ee10-maven.xml").toFile()))
- {
- IO.copy(jettyMavenStream, fileStream);
- }
-
- //if there were plugin dependencies, copy them into lib/ext
- if (libExtJarFiles != null && !libExtJarFiles.isEmpty())
- {
- Path libExtPath = Files.createDirectories(libPath.resolve("ext"));
- for (File f : libExtJarFiles)
- {
- try (InputStream jarStream = new FileInputStream(f);
- FileOutputStream fileStream = new FileOutputStream(libExtPath.resolve(f.getName()).toFile()))
- {
- IO.copy(jarStream, fileStream);
- }
- }
- }
- }
-
- private void configureJettyHome()
- throws Exception
- {
- if (jettyHome == null && jettyHomeZip == null)
- throw new IllegalStateException("No jettyHome");
-
- if (baseDir == null)
- throw new IllegalStateException("No baseDir");
-
- if (jettyHome == null)
- {
- try (ResourceFactory.Closeable resourceFactory = ResourceFactory.closeable())
- {
- Resource res = resourceFactory.newJarFileResource(jettyHomeZip.toPath().toUri());
- res.copyTo(baseDir.toPath()); // TODO: Resource.copyTo() cannot copy dir to dir, only file to file
- }
- //zip will unpack to target/jetty-home-
- jettyHome = new File(baseDir, "jetty-home-" + version);
- }
- }
}
diff --git a/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/JettyRunMojo.java b/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/JettyRunMojo.java
index 8374459f948b..7ff6e7d8f823 100644
--- a/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/JettyRunMojo.java
+++ b/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/JettyRunMojo.java
@@ -28,6 +28,7 @@
import org.apache.maven.plugins.annotations.Parameter;
import org.apache.maven.plugins.annotations.ResolutionScope;
import org.eclipse.jetty.ee10.webapp.WebAppContext;
+import org.eclipse.jetty.maven.ConsoleReader;
import org.eclipse.jetty.util.IncludeExcludeSet;
import org.eclipse.jetty.util.Scanner;
import org.eclipse.jetty.util.component.LifeCycle;
@@ -355,7 +356,7 @@ public void restartWebApp(boolean reconfigure) throws Exception
}
}
- embedder.getWebApp().stop();
+ embedder.stopWebApp();
configureWebApp();
embedder.redeployWebApp();
if (scanner != null)
diff --git a/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/JettyRunWarMojo.java b/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/JettyRunWarMojo.java
index 18f5aa51ef89..a87bc4cdeaa2 100644
--- a/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/JettyRunWarMojo.java
+++ b/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/JettyRunWarMojo.java
@@ -25,6 +25,7 @@
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;
import org.apache.maven.plugins.annotations.ResolutionScope;
+import org.eclipse.jetty.maven.ConsoleReader;
import org.eclipse.jetty.util.Scanner;
import org.eclipse.jetty.util.StringUtil;
@@ -235,7 +236,7 @@ public void restartWebApp(boolean reconfigure) throws Exception
warArtifacts = null;
configureScanner();
}
- embedder.getWebApp().stop();
+ embedder.stopWebApp();
configureWebApp();
embedder.redeployWebApp();
scanner.start();
diff --git a/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/MavenResource.java b/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/MavenResource.java
deleted file mode 100644
index ab2f6ca7a35f..000000000000
--- a/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/MavenResource.java
+++ /dev/null
@@ -1,220 +0,0 @@
-//
-// ========================================================================
-// Copyright (c) 1995 Mort Bay Consulting Pty Ltd and others.
-//
-// This program and the accompanying materials are made available under the
-// terms of the Eclipse Public License v. 2.0 which is available at
-// https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
-// which is available at https://www.apache.org/licenses/LICENSE-2.0.
-//
-// SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
-// ========================================================================
-//
-
-package org.eclipse.jetty.ee10.maven.plugin;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URI;
-import java.nio.file.Path;
-import java.time.Instant;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.jetty.util.resource.Resource;
-import org.eclipse.jetty.util.resource.ResourceFactory;
-
-/**
- * MavenResource
- *
- * A helper class to allow Resources to be used in maven pom.xml configuration by
- * providing a no-arg constructor and a setter that accepts a simple string as a
- * file location. This class delegates to a real Resource obtained using a
- * ResourceFactory.
- */
-public class MavenResource extends Resource
-{
- private static final ResourceFactory __resourceFactory = ResourceFactory.root();
- private String _resourceString;
- private Resource _resource;
-
- public MavenResource()
- {
- }
-
- @Override
- public void copyTo(Path destination) throws IOException
- {
- if (_resource == null)
- return;
- _resource.copyTo(destination);
- }
-
- @Override
- public boolean exists()
- {
- if (_resource == null)
- return false;
- return _resource.exists();
- }
-
- @Override
- public Collection getAllResources()
- {
- if (_resource == null)
- return null;
- return _resource.getAllResources();
- }
-
- @Override
- public String getFileName()
- {
- if (_resource == null)
- return null;
- return _resource.getFileName();
- }
-
- @Override
- public String getName()
- {
- if (_resource == null)
- return null;
- return _resource.getName();
- }
-
- @Override
- public Path getPath()
- {
- if (_resource == null)
- return null;
-
- return _resource.getPath();
- }
-
- @Override
- public URI getRealURI()
- {
- if (_resource == null)
- return null;
- return _resource.getRealURI();
- }
-
- public String getResourceAsString()
- {
- return _resourceString;
- }
-
- public void setResourceAsString(String resourceString)
- {
- _resourceString = resourceString;
- _resource = __resourceFactory.newResource(_resourceString);
- }
-
- @Override
- public URI getURI()
- {
- if (_resource == null)
- return null;
-
- return _resource.getURI();
- }
-
- @Override
- public boolean isAlias()
- {
- if (_resource == null)
- return false;
- return _resource.isAlias();
- }
-
- @Override
- public boolean isContainedIn(Resource container)
- {
- if (_resource == null)
- return false;
- return _resource.isContainedIn(container);
- }
-
- @Override
- public boolean contains(Resource other)
- {
- if (_resource == null)
- return false;
- return _resource.contains(other);
- }
-
- @Override
- public Path getPathTo(Resource other)
- {
- if (_resource == null)
- return null;
- return _resource.getPathTo(other);
- }
-
- @Override
- public boolean isDirectory()
- {
- if (_resource == null)
- return false;
-
- return _resource.isDirectory();
- }
-
- @Override
- public boolean isReadable()
- {
- if (_resource == null)
- return false;
-
- return _resource.isReadable();
- }
-
- @Override
- public Iterator iterator()
- {
- if (_resource == null)
- return null;
- return _resource.iterator();
- }
-
- @Override
- public Instant lastModified()
- {
- if (_resource == null)
- return null;
- return _resource.lastModified();
- }
-
- @Override
- public long length()
- {
- if (_resource == null)
- return -1;
- return _resource.length();
- }
-
- @Override
- public List list()
- {
- if (_resource == null)
- return null;
- return _resource.list();
- }
-
- @Override
- public InputStream newInputStream() throws IOException
- {
- if (_resource == null)
- return null;
- return _resource.newInputStream();
- }
-
- @Override
- public Resource resolve(String subUriPath)
- {
- if (_resource == null)
- return null;
- return _resource.resolve(subUriPath);
- }
-}
\ No newline at end of file
diff --git a/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/MavenServerConnector.java b/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/MavenServerConnector.java
deleted file mode 100644
index 7e3a721cf80e..000000000000
--- a/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/MavenServerConnector.java
+++ /dev/null
@@ -1,221 +0,0 @@
-//
-// ========================================================================
-// Copyright (c) 1995 Mort Bay Consulting Pty Ltd and others.
-//
-// This program and the accompanying materials are made available under the
-// terms of the Eclipse Public License v. 2.0 which is available at
-// https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
-// which is available at https://www.apache.org/licenses/LICENSE-2.0.
-//
-// SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
-// ========================================================================
-//
-
-package org.eclipse.jetty.ee10.maven.plugin;
-
-import java.util.Collection;
-import java.util.List;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.Executor;
-
-import org.eclipse.jetty.io.ByteBufferPool;
-import org.eclipse.jetty.io.EndPoint;
-import org.eclipse.jetty.server.ConnectionFactory;
-import org.eclipse.jetty.server.Connector;
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.server.ServerConnector;
-import org.eclipse.jetty.util.annotation.ManagedAttribute;
-import org.eclipse.jetty.util.component.ContainerLifeCycle;
-import org.eclipse.jetty.util.thread.Scheduler;
-
-/**
- * MavenServerConnector
- *
- * As the ServerConnector class does not have a no-arg constructor, and moreover requires
- * the server instance passed in to all its constructors, it cannot
- * be referenced in the pom.xml. This class wraps a ServerConnector, delaying setting the
- * server instance. Only a few of the setters from the ServerConnector class are supported.
- */
-public class MavenServerConnector extends ContainerLifeCycle implements Connector
-{
- public static String PORT_SYSPROPERTY = "jetty.http.port";
-
- public static final int DEFAULT_PORT = 8080;
- public static final String DEFAULT_PORT_STR = String.valueOf(DEFAULT_PORT);
- public static final int DEFAULT_MAX_IDLE_TIME = 30000;
-
- private Server server;
- private volatile ServerConnector delegate;
- private String host;
- private String name;
- private int port;
- private long idleTimeout;
-
- public MavenServerConnector()
- {
- }
-
- public void setServer(Server server)
- {
- this.server = server;
- }
-
- public void setHost(String host)
- {
- this.host = host;
- }
-
- public String getHost()
- {
- return this.host;
- }
-
- public void setPort(int port)
- {
- this.port = port;
- }
-
- public int getPort()
- {
- return this.port;
- }
-
- public void setName(String name)
- {
- this.name = name;
- }
-
- public void setIdleTimeout(long idleTimeout)
- {
- this.idleTimeout = idleTimeout;
- }
-
- @Override
- protected void doStart() throws Exception
- {
-
- if (this.server == null)
- throw new IllegalStateException("Server not set for MavenServerConnector");
-
- this.delegate = new ServerConnector(this.server);
- this.delegate.setName(this.name);
- this.delegate.setPort(this.port);
- this.delegate.setHost(this.host);
- this.delegate.setIdleTimeout(idleTimeout);
- this.delegate.start();
-
- super.doStart();
- }
-
- @Override
- protected void doStop() throws Exception
- {
- this.delegate.stop();
- super.doStop();
- this.delegate = null;
- }
-
- @Override
- public CompletableFuture shutdown()
- {
- return checkDelegate().shutdown();
- }
-
- @Override
- public boolean isShutdown()
- {
- return checkDelegate().isShutdown();
- }
-
- @Override
- public Server getServer()
- {
- return this.server;
- }
-
- @Override
- public Executor getExecutor()
- {
- return checkDelegate().getExecutor();
- }
-
- @Override
- public Scheduler getScheduler()
- {
- return checkDelegate().getScheduler();
- }
-
- @Override
- public ByteBufferPool getByteBufferPool()
- {
- return checkDelegate().getByteBufferPool();
- }
-
- @Override
- public ConnectionFactory getConnectionFactory(String nextProtocol)
- {
- return checkDelegate().getConnectionFactory(nextProtocol);
- }
-
- @Override
- public T getConnectionFactory(Class factoryType)
- {
- return checkDelegate().getConnectionFactory(factoryType);
- }
-
- @Override
- public ConnectionFactory getDefaultConnectionFactory()
- {
- return checkDelegate().getDefaultConnectionFactory();
- }
-
- @Override
- public Collection getConnectionFactories()
- {
- return checkDelegate().getConnectionFactories();
- }
-
- @Override
- public List getProtocols()
- {
- return checkDelegate().getProtocols();
- }
-
- @Override
- @ManagedAttribute("maximum time a connection can be idle before being closed (in ms)")
- public long getIdleTimeout()
- {
- return checkDelegate().getIdleTimeout();
- }
-
- @Override
- public Object getTransport()
- {
- return checkDelegate().getTransport();
- }
-
- @Override
- public Collection getConnectedEndPoints()
- {
- return checkDelegate().getConnectedEndPoints();
- }
-
- @Override
- public String getName()
- {
- return this.name;
- }
-
- public int getLocalPort()
- {
- return this.delegate.getLocalPort();
- }
-
- private ServerConnector checkDelegate() throws IllegalStateException
- {
- ServerConnector d = this.delegate;
- if (d == null)
- throw new IllegalStateException("MavenServerConnector delegate not ready");
- return d;
- }
-}
diff --git a/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/MavenWebAppContext.java b/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/MavenWebAppContext.java
index 65939e592025..8f73478cd22e 100644
--- a/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/MavenWebAppContext.java
+++ b/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/MavenWebAppContext.java
@@ -36,6 +36,7 @@
import org.eclipse.jetty.ee10.webapp.Configurations;
import org.eclipse.jetty.ee10.webapp.MetaInfConfiguration;
import org.eclipse.jetty.ee10.webapp.WebAppContext;
+import org.eclipse.jetty.maven.Overlay;
import org.eclipse.jetty.util.FileID;
import org.eclipse.jetty.util.StringUtil;
import org.eclipse.jetty.util.URIUtil;
diff --git a/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/Overlay.java b/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/Overlay.java
deleted file mode 100644
index 51b9a6b43575..000000000000
--- a/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/Overlay.java
+++ /dev/null
@@ -1,103 +0,0 @@
-//
-// ========================================================================
-// Copyright (c) 1995 Mort Bay Consulting Pty Ltd and others.
-//
-// This program and the accompanying materials are made available under the
-// terms of the Eclipse Public License v. 2.0 which is available at
-// https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
-// which is available at https://www.apache.org/licenses/LICENSE-2.0.
-//
-// SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
-// ========================================================================
-//
-
-package org.eclipse.jetty.ee10.maven.plugin;
-
-import java.io.File;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.time.Instant;
-
-import org.eclipse.jetty.util.resource.Resource;
-
-/**
- * Overlay
- *
- * An Overlay represents overlay information derived from the
- * maven-war-plugin.
- */
-public class Overlay
-{
- private OverlayConfig _config;
- private Resource _resource;
-
- public Overlay(OverlayConfig config, Resource resource)
- {
- _config = config;
- _resource = resource;
- }
-
- public Overlay(OverlayConfig config)
- {
- _config = config;
- }
-
- public void setResource(Resource r)
- {
- _resource = r;
- }
-
- public Resource getResource()
- {
- return _resource;
- }
-
- public OverlayConfig getConfig()
- {
- return _config;
- }
-
- @Override
- public String toString()
- {
- StringBuilder strbuff = new StringBuilder();
- if (_resource != null)
- strbuff.append(_resource);
- if (_config != null)
- {
- strbuff.append(" [");
- strbuff.append(_config);
- strbuff.append("]");
- }
- return strbuff.toString();
- }
-
- /**
- * Unpack the overlay into the given directory. Only
- * unpack if the directory does not exist, or the overlay
- * has been modified since the dir was created.
- *
- * @param dir the directory into which to unpack the overlay
- * @throws IOException
- */
- public void unpackTo(File dir) throws IOException // TODO: change to Path
- {
- if (dir == null)
- throw new IllegalStateException("No overly unpack directory");
- Path pathDir = dir.toPath();
- // only unpack if the overlay is newer
- if (!Files.exists(pathDir))
- {
- // create directory
- Files.createDirectories(pathDir);
- getResource().copyTo(pathDir);
- }
- else
- {
- Instant dirLastModified = Files.getLastModifiedTime(pathDir).toInstant();
- if (getResource().lastModified().isAfter(dirLastModified))
- getResource().copyTo(pathDir);
- }
- }
-}
diff --git a/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/OverlayConfig.java b/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/OverlayConfig.java
deleted file mode 100644
index 26f0342db4f5..000000000000
--- a/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/OverlayConfig.java
+++ /dev/null
@@ -1,337 +0,0 @@
-//
-// ========================================================================
-// Copyright (c) 1995 Mort Bay Consulting Pty Ltd and others.
-//
-// This program and the accompanying materials are made available under the
-// terms of the Eclipse Public License v. 2.0 which is available at
-// https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
-// which is available at https://www.apache.org/licenses/LICENSE-2.0.
-//
-// SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
-// ========================================================================
-//
-
-package org.eclipse.jetty.ee10.maven.plugin;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.List;
-
-import org.codehaus.plexus.util.xml.Xpp3Dom;
-import org.eclipse.jetty.util.StringUtil;
-
-/**
- * OverlayConfig
- *
- * The configuration of a war overlay in a pom. Used to help determine which resources
- * from a project's dependent war should be included.
- */
-public class OverlayConfig
-{
- private String targetPath;
- private String groupId;
- private String artifactId;
- private String classifier;
- private List includes;
- private List excludes;
- private boolean skip;
- private boolean filtered;
-
- public OverlayConfig()
- {
- }
-
- public OverlayConfig(String fmt, List defaultIncludes, List defaultExcludes)
- {
- if (fmt == null)
- return;
- String[] atoms = StringUtil.csvSplit(fmt);
- for (int i = 0; i < atoms.length; i++)
- {
- String s = atoms[i].trim();
- switch (i)
- {
- case 0:
- {
- if (!"".equals(s))
- groupId = s;
- break;
- }
- case 1:
- {
- if (!"".equals(s))
- artifactId = s;
- break;
- }
- case 2:
- {
- if (!"".equals(s))
- classifier = s;
- break;
- }
- case 3:
- {
- if (!"".equals(s))
- targetPath = s;
- break;
- }
- case 4:
- {
- if ("".equals(s))
- skip = false;
- else
- skip = Boolean.valueOf(s);
- break;
- }
- case 5:
- {
- if ("".equals(s))
- filtered = false;
- else
- filtered = Boolean.valueOf(s);
- break;
- }
- case 6:
- {
- if ("".equals(s))
- break;
- String[] incs = s.split(";");
- if (incs.length > 0)
- includes = Arrays.asList(incs);
- break;
- }
- case 7:
- {
- if ("".equals(s))
- break;
- String[] exs = s.split(";");
- if (exs.length > 0)
- excludes = Arrays.asList(exs);
- break;
- }
- default:
- break;
- }
- }
- }
-
- public OverlayConfig(Xpp3Dom root, List defaultIncludes, List defaultExcludes)
- {
- Xpp3Dom node = root.getChild("groupId");
- setGroupId(node == null ? null : node.getValue());
-
- node = root.getChild("artifactId");
- setArtifactId(node == null ? null : node.getValue());
-
- node = root.getChild("classifier");
- setClassifier(node == null ? null : node.getValue());
-
- node = root.getChild("targetPath");
- setTargetPath(node == null ? null : node.getValue());
-
- node = root.getChild("skip");
- setSkip(node == null ? false : Boolean.valueOf(node.getValue()));
-
- node = root.getChild("filtered");
- setFiltered(node == null ? false : Boolean.valueOf(node.getValue()));
-
- node = root.getChild("includes");
- List includes = null;
- if (node != null && node.getChildCount() > 0)
- {
- Xpp3Dom[] list = node.getChildren("include");
- for (int j = 0; list != null && j < list.length; j++)
- {
- if (includes == null)
- includes = new ArrayList<>();
- includes.add(list[j].getValue());
- }
- }
- if (includes == null && defaultIncludes != null)
- {
- includes = new ArrayList<>();
- includes.addAll(defaultIncludes);
- }
- setIncludes(includes);
-
- node = root.getChild("excludes");
- List excludes = null;
- if (node != null && node.getChildCount() > 0)
- {
- Xpp3Dom[] list = node.getChildren("exclude");
- for (int j = 0; list != null && j < list.length; j++)
- {
- if (excludes == null)
- excludes = new ArrayList<>();
- excludes.add(list[j].getValue());
- }
- }
- if (excludes == null && defaultExcludes != null)
- {
- excludes = new ArrayList<>();
- excludes.addAll(defaultExcludes);
- }
- setExcludes(excludes);
- }
-
- public String getTargetPath()
- {
- return targetPath;
- }
-
- public void setTargetPath(String targetPath)
- {
- this.targetPath = targetPath;
- }
-
- public String getGroupId()
- {
- return groupId;
- }
-
- public void setGroupId(String groupId)
- {
- this.groupId = groupId;
- }
-
- public String getArtifactId()
- {
- return artifactId;
- }
-
- public void setArtifactId(String artifactId)
- {
- this.artifactId = artifactId;
- }
-
- public String getClassifier()
- {
- return classifier;
- }
-
- public void setClassifier(String classifier)
- {
- this.classifier = classifier;
- }
-
- public List getIncludes()
- {
- return includes;
- }
-
- public void setIncludes(List includes)
- {
- this.includes = includes;
- }
-
- public List getExcludes()
- {
- return excludes;
- }
-
- public void setExcludes(List excludes)
- {
- this.excludes = excludes;
- }
-
- public boolean isSkip()
- {
- return skip;
- }
-
- public void setSkip(boolean skip)
- {
- this.skip = skip;
- }
-
- public boolean isFiltered()
- {
- return filtered;
- }
-
- public void setFiltered(boolean filtered)
- {
- this.filtered = filtered;
- }
-
- public boolean isCurrentProject()
- {
- if (this.groupId == null && this.artifactId == null)
- return true;
- return false;
- }
-
- /**
- * Check if this overlay configuration matches an Artifact's info
- *
- * @param gid Artifact groupId
- * @param aid Artifact artifactId
- * @param cls Artifact classifier
- * @return true if matched
- */
- public boolean matchesArtifact(String gid, String aid, String cls)
- {
- if (((getGroupId() == null && gid == null) || (getGroupId() != null && getGroupId().equals(gid))) &&
- ((getArtifactId() == null && aid == null) || (getArtifactId() != null && getArtifactId().equals(aid))) &&
- ((getClassifier() == null) || (getClassifier().equals(cls))))
- return true;
-
- return false;
- }
-
- /**
- * Check if this overlay configuration matches an Artifact's info
- *
- * @param gid the group id
- * @param aid the artifact id
- * @return true if matched
- */
- public boolean matchesArtifact(String gid, String aid)
- {
- if (((getGroupId() == null && gid == null) || (getGroupId() != null && getGroupId().equals(gid))) &&
- ((getArtifactId() == null && aid == null) || (getArtifactId() != null && getArtifactId().equals(aid))))
- return true;
-
- return false;
- }
-
- @Override
- public String toString()
- {
- StringBuilder strbuff = new StringBuilder();
- strbuff.append((groupId != null ? groupId : "") + ",");
- strbuff.append((artifactId != null ? artifactId : "") + ",");
- strbuff.append((classifier != null ? classifier : "") + ",");
- strbuff.append((targetPath != null ? targetPath : "") + ",");
- strbuff.append("" + skip + ",");
- strbuff.append("" + filtered + ",");
-
- if (includes != null)
- {
- Iterator itor = includes.iterator();
- while (itor.hasNext())
- {
- strbuff.append(itor.next());
- if (itor.hasNext())
- strbuff.append(";");
- }
- }
-
- strbuff.append(", ");
-
- if (excludes != null)
- {
- Iterator itor = excludes.iterator();
- while (itor.hasNext())
- {
- strbuff.append(itor.next());
- if (itor.hasNext())
- strbuff.append(";");
- }
- }
-
- return strbuff.toString();
- }
-}
-
diff --git a/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/OverlayManager.java b/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/OverlayManager.java
deleted file mode 100644
index 40e353998d09..000000000000
--- a/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/OverlayManager.java
+++ /dev/null
@@ -1,163 +0,0 @@
-//
-// ========================================================================
-// Copyright (c) 1995 Mort Bay Consulting Pty Ltd and others.
-//
-// This program and the accompanying materials are made available under the
-// terms of the Eclipse Public License v. 2.0 which is available at
-// https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
-// which is available at https://www.apache.org/licenses/LICENSE-2.0.
-//
-// SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
-// ========================================================================
-//
-
-package org.eclipse.jetty.ee10.maven.plugin;
-
-import java.io.File;
-import java.io.IOException;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Objects;
-import java.util.Set;
-
-import org.apache.maven.artifact.Artifact;
-import org.eclipse.jetty.ee10.webapp.WebAppContext;
-import org.eclipse.jetty.util.URIUtil;
-import org.eclipse.jetty.util.resource.MountedPathResource;
-import org.eclipse.jetty.util.resource.Resource;
-import org.eclipse.jetty.util.resource.ResourceFactory;
-
-/**
- * OverlayManager
- *
- * Mediates information about overlays configured in a war plugin.
- *
- */
-public class OverlayManager
-{
- private WarPluginInfo warPlugin;
-
- public OverlayManager(WarPluginInfo warPlugin)
- {
- this.warPlugin = warPlugin;
- }
-
- public void applyOverlays(MavenWebAppContext webApp) throws IOException
- {
- Objects.requireNonNull(webApp);
- List resourceBases = new ArrayList();
-
- for (Overlay o : getOverlays(webApp))
- {
- //can refer to the current project in list of overlays for ordering purposes
- if (o.getConfig() != null && o.getConfig().isCurrentProject() && webApp.getBaseResource().exists())
- {
- resourceBases.add(webApp.getBaseResource());
- continue;
- }
- //add in the selectively unpacked overlay in the correct order to the webapp's resource base
- resourceBases.add(unpackOverlay(webApp, o));
- }
-
- if (!resourceBases.contains(webApp.getBaseResource()) && webApp.getBaseResource().exists())
- {
- if (webApp.getBaseAppFirst())
- resourceBases.add(0, webApp.getBaseResource());
- else
- resourceBases.add(webApp.getBaseResource());
- }
-
- webApp.setBaseResource(ResourceFactory.combine(resourceBases));
- }
-
- /**
- * Generate an ordered list of overlays
- */
- protected List getOverlays(WebAppContext webApp)
- {
- Set matchedWarArtifacts = new HashSet();
- List overlays = new ArrayList();
-
- //Check all of the overlay configurations
- for (OverlayConfig config:warPlugin.getMavenWarOverlayConfigs())
- {
- //overlays can be individually skipped
- if (config.isSkip())
- continue;
-
- //an empty overlay refers to the current project - important for ordering
- if (config.isCurrentProject())
- {
- Overlay overlay = new Overlay(config, null);
- overlays.add(overlay);
- continue;
- }
-
- //if a war matches an overlay config
- Artifact a = warPlugin.getWarArtifact(config.getGroupId(), config.getArtifactId(), config.getClassifier());
- if (a != null)
- {
- matchedWarArtifacts.add(a);
- Resource resource = webApp.getResourceFactory().newJarFileResource(a.getFile().toPath().toUri());
- SelectiveJarResource r = new SelectiveJarResource(resource);
- r.setIncludes(config.getIncludes());
- r.setExcludes(config.getExcludes());
- Overlay overlay = new Overlay(config, r);
- overlays.add(overlay);
- }
- }
-
- //iterate over the left over war artifacts add them
- for (Artifact a: warPlugin.getWarArtifacts())
- {
- if (!matchedWarArtifacts.contains(a))
- {
- Resource resource = webApp.getResourceFactory().newJarFileResource(a.getFile().toPath().toUri());
- Overlay overlay = new Overlay(null, resource);
- overlays.add(overlay);
- }
- }
- return overlays;
- }
-
- /**
- * Unpack a war overlay.
- *
- * @param overlay the war overlay to unpack
- * @return the location to which it was unpacked
- * @throws IOException if there is an IO problem
- */
- protected Resource unpackOverlay(WebAppContext webApp, Overlay overlay)
- throws IOException
- {
- Objects.requireNonNull(webApp);
-
- if (overlay.getResource() == null)
- return null; //nothing to unpack
-
- //Get the name of the overlayed war and unpack it to a dir of the
- //same name in the temporary directory.
- //We know it is a war because it came from the maven repo
- assert overlay.getResource() instanceof MountedPathResource;
-
- Path p = Paths.get(URIUtil.unwrapContainer(overlay.getResource().getURI()));
- String name = p.getName(p.getNameCount() - 1).toString();
- name = name.replace('.', '_');
-
- File overlaysDir = new File(warPlugin.getProject().getBuild().getDirectory(), "jetty_overlays");
- File dir = new File(overlaysDir, name);
-
- //if specified targetPath, unpack to that subdir instead
- File unpackDir = dir;
- if (overlay.getConfig() != null && overlay.getConfig().getTargetPath() != null)
- unpackDir = new File(dir, overlay.getConfig().getTargetPath());
-
- overlay.unpackTo(unpackDir);
-
- //use top level of unpacked content
- return webApp.getResourceFactory().newResource(unpackDir.getCanonicalPath());
- }
-}
diff --git a/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/PluginLog.java b/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/PluginLog.java
deleted file mode 100644
index 7adb0007d8d8..000000000000
--- a/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/PluginLog.java
+++ /dev/null
@@ -1,37 +0,0 @@
-//
-// ========================================================================
-// Copyright (c) 1995 Mort Bay Consulting Pty Ltd and others.
-//
-// This program and the accompanying materials are made available under the
-// terms of the Eclipse Public License v. 2.0 which is available at
-// https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
-// which is available at https://www.apache.org/licenses/LICENSE-2.0.
-//
-// SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
-// ========================================================================
-//
-
-package org.eclipse.jetty.ee10.maven.plugin;
-
-import org.apache.maven.plugin.logging.Log;
-
-/**
- * PluginLog
- *
- * Convenience class to provide access to the plugin
- * Log for non-mojo classes.
- */
-public class PluginLog
-{
- private static Log log = null;
-
- public static void setLog(Log l)
- {
- log = l;
- }
-
- public static Log getLog()
- {
- return log;
- }
-}
diff --git a/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/QuickStartGenerator.java b/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/QuickStartGenerator.java
index 6fde7cf5b363..1b3a712c0bc6 100644
--- a/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/QuickStartGenerator.java
+++ b/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/QuickStartGenerator.java
@@ -18,6 +18,8 @@
import org.eclipse.jetty.ee10.annotations.AnnotationConfiguration;
import org.eclipse.jetty.ee10.quickstart.QuickStartConfiguration;
import org.eclipse.jetty.ee10.quickstart.QuickStartConfiguration.Mode;
+import org.eclipse.jetty.ee10.webapp.Configurations;
+import org.eclipse.jetty.maven.ServerSupport;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.util.thread.QueuedThreadPool;
@@ -148,7 +150,7 @@ public void generate() throws Exception
//ensure handler structure enabled
ServerSupport.configureHandlers(server, null, null);
- ServerSupport.configureDefaultConfigurationClasses(server);
+ Configurations.setServerDefault(server);
//if our server has a thread pool associated we can do annotation scanning multithreaded,
//otherwise scanning will be single threaded
diff --git a/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/ScanPattern.java b/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/ScanPattern.java
deleted file mode 100644
index 889ba74f59bc..000000000000
--- a/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/ScanPattern.java
+++ /dev/null
@@ -1,48 +0,0 @@
-//
-// ========================================================================
-// Copyright (c) 1995 Mort Bay Consulting Pty Ltd and others.
-//
-// This program and the accompanying materials are made available under the
-// terms of the Eclipse Public License v. 2.0 which is available at
-// https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
-// which is available at https://www.apache.org/licenses/LICENSE-2.0.
-//
-// SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
-// ========================================================================
-//
-
-package org.eclipse.jetty.ee10.maven.plugin;
-
-import java.util.Collections;
-import java.util.List;
-
-/**
- * ScanPattern
- *
- * Ant-style pattern of includes and excludes.
- */
-public class ScanPattern
-{
- private List _includes = Collections.emptyList();
- private List _excludes = Collections.emptyList();
-
- public void setIncludes(List includes)
- {
- _includes = includes;
- }
-
- public void setExcludes(List excludes)
- {
- _excludes = excludes;
- }
-
- public List getIncludes()
- {
- return _includes;
- }
-
- public List getExcludes()
- {
- return _excludes;
- }
-}
diff --git a/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/ScanTargetPattern.java b/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/ScanTargetPattern.java
deleted file mode 100644
index 34e42a818915..000000000000
--- a/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/ScanTargetPattern.java
+++ /dev/null
@@ -1,108 +0,0 @@
-//
-// ========================================================================
-// Copyright (c) 1995 Mort Bay Consulting Pty Ltd and others.
-//
-// This program and the accompanying materials are made available under the
-// terms of the Eclipse Public License v. 2.0 which is available at
-// https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
-// which is available at https://www.apache.org/licenses/LICENSE-2.0.
-//
-// SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
-// ========================================================================
-//
-
-package org.eclipse.jetty.ee10.maven.plugin;
-
-import java.io.File;
-import java.nio.file.Path;
-import java.nio.file.PathMatcher;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.jetty.util.IncludeExcludeSet;
-
-/**
- * ScanTargetPattern
- *
- * Utility class to provide the ability for the mvn jetty:run
- * mojo to be able to specify filesets of extra files to
- * regularly scan for changes in order to redeploy the webapp.
- *
- * For example:
- *
- * <scanTargetPattern>
- * <directory>/some/place</directory>
- * <includes>
- * <include>some ant pattern here </include>
- * <include>some ant pattern here </include>
- * </includes>
- * <excludes>
- * <exclude>some ant pattern here </exclude>
- * <exclude>some ant pattern here </exclude>
- * </excludes>
- * </scanTargetPattern>
- */
-public class ScanTargetPattern
-{
- private File _directory;
- private ScanPattern _pattern;
-
- /**
- * Get the _directory.
- * @return the _directory
- */
- public File getDirectory()
- {
- return _directory;
- }
-
- /**
- * Set the directory to set.
- * @param directory the directory to set
- */
- public void setDirectory(File directory)
- {
- this._directory = directory;
- }
-
- public void setIncludes(List includes)
- {
- if (_pattern == null)
- _pattern = new ScanPattern();
- _pattern.setIncludes(includes);
- }
-
- public void setExcludes(List excludes)
- {
- if (_pattern == null)
- _pattern = new ScanPattern();
- _pattern.setExcludes(excludes);
- }
-
- public List getIncludes()
- {
- return (_pattern == null ? Collections.emptyList() : _pattern.getIncludes());
- }
-
- public List getExcludes()
- {
- return (_pattern == null ? Collections.emptyList() : _pattern.getExcludes());
- }
-
- public void configureIncludesExcludeSet(IncludeExcludeSet includesExcludes)
- {
- for (String include:getIncludes())
- {
- if (!include.startsWith("glob:"))
- include = "glob:" + include;
- includesExcludes.include(_directory.toPath().getFileSystem().getPathMatcher(include));
- }
-
- for (String exclude:getExcludes())
- {
- if (!exclude.startsWith("glob:"))
- exclude = "glob:" + exclude;
- includesExcludes.exclude(_directory.toPath().getFileSystem().getPathMatcher(exclude));
- }
- }
-}
diff --git a/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/SelectiveJarResource.java b/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/SelectiveJarResource.java
deleted file mode 100644
index 4a874dada7cb..000000000000
--- a/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/SelectiveJarResource.java
+++ /dev/null
@@ -1,280 +0,0 @@
-//
-// ========================================================================
-// Copyright (c) 1995 Mort Bay Consulting Pty Ltd and others.
-//
-// This program and the accompanying materials are made available under the
-// terms of the Eclipse Public License v. 2.0 which is available at
-// https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
-// which is available at https://www.apache.org/licenses/LICENSE-2.0.
-//
-// SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
-// ========================================================================
-//
-
-package org.eclipse.jetty.ee10.maven.plugin;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.URI;
-import java.net.URL;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.attribute.FileTime;
-import java.time.Instant;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import java.util.jar.JarEntry;
-import java.util.jar.JarInputStream;
-import java.util.jar.Manifest;
-
-import org.codehaus.plexus.util.SelectorUtils;
-import org.eclipse.jetty.util.IO;
-import org.eclipse.jetty.util.URIUtil;
-import org.eclipse.jetty.util.resource.Resource;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * SelectiveJarResource
- *
- * Selectively copies resources from a jar file based on includes/excludes.
- * TODO: investigate if copyTo() can instead have an IncludeExcludeSet as a parameter?
- * TODO: or have a smaller ResourceWrapper jetty-core class that can be overridden for specific behavior like in this class
- */
-public class SelectiveJarResource extends Resource
-{
- private static final Logger LOG = LoggerFactory.getLogger(SelectiveJarResource.class);
-
- /**
- * Default matches every resource.
- */
- public static final List DEFAULT_INCLUDES =
- Arrays.asList(new String[]{"**"});
-
- /**
- * Default is to exclude nothing.
- */
- public static final List DEFAULT_EXCLUDES = Collections.emptyList();
-
- final Resource _delegate;
- List _includes = null;
- List _excludes = null;
- boolean _caseSensitive = false;
-
- public SelectiveJarResource(Resource resource)
- {
- _delegate = resource;
- }
-
- public void setCaseSensitive(boolean caseSensitive)
- {
- _caseSensitive = caseSensitive;
- }
-
- public void setIncludes(List patterns)
- {
- _includes = patterns;
- }
-
- public void setExcludes(List patterns)
- {
- _excludes = patterns;
- }
-
- protected boolean isIncluded(String name)
- {
- for (String include : _includes)
- {
- if (SelectorUtils.matchPath(include, name, "/", _caseSensitive))
- {
- return true;
- }
- }
- return false;
- }
-
- protected boolean isExcluded(String name)
- {
- for (String exclude : _excludes)
- {
- if (SelectorUtils.matchPath(exclude, name, "/", _caseSensitive))
- {
- return true;
- }
- }
- return false;
- }
-
- @Override
- public Path getPath()
- {
- return _delegate.getPath();
- }
-
- @Override
- public boolean isDirectory()
- {
- return _delegate.isDirectory();
- }
-
- @Override
- public Instant lastModified()
- {
- return _delegate.lastModified();
- }
-
- @Override
- public boolean isReadable()
- {
- return _delegate.isReadable();
- }
-
- @Override
- public boolean isContainedIn(Resource container)
- {
- return _delegate.isContainedIn(container);
- }
-
- @Override
- public boolean contains(Resource other)
- {
- return _delegate.contains(other);
- }
-
- @Override
- public Path getPathTo(Resource other)
- {
- return _delegate.getPathTo(other);
- }
-
- @Override
- public URI getURI()
- {
- return _delegate.getURI();
- }
-
- @Override
- public String getName()
- {
- return _delegate.getName();
- }
-
- @Override
- public String getFileName()
- {
- return _delegate.getFileName();
- }
-
- @Override
- public Resource resolve(String subUriPath)
- {
- return _delegate.resolve(subUriPath);
- }
-
- @Override
- public void copyTo(Path directory) throws IOException
- {
- if (_includes == null)
- _includes = DEFAULT_INCLUDES;
- if (_excludes == null)
- _excludes = DEFAULT_EXCLUDES;
-
- //Copy contents of the jar file to the given directory,
- //using the includes and excludes patterns to control which
- //parts of the jar file are copied
- if (!exists())
- return;
-
- String urlString = this.getURI().toASCIIString().trim();
- int endOfJarUrl = urlString.indexOf("!/");
- int startOfJarUrl = (endOfJarUrl >= 0 ? 4 : 0);
-
- if (endOfJarUrl < 0)
- throw new IOException("Not a valid jar url: " + urlString);
-
- URL jarFileURL = new URL(urlString.substring(startOfJarUrl, endOfJarUrl));
-
- try (InputStream is = jarFileURL.openConnection().getInputStream();
- JarInputStream jin = new JarInputStream(is))
- {
- JarEntry entry;
-
- while ((entry = jin.getNextJarEntry()) != null)
- {
- String entryName = entry.getName();
-
- LOG.debug("Looking at {}", entryName);
- // make sure no access out of the root entry is present
- if (URIUtil.isNotNormalWithinSelf(entryName))
- {
- LOG.info("Invalid entry: {}", entryName);
- continue;
- }
-
- Path file = directory.resolve(entryName);
-
- if (entry.isDirectory())
- {
- if (isIncluded(entryName))
- {
- if (!isExcluded(entryName))
- {
- // Make directory
- if (!Files.exists(file))
- Files.createDirectories(file);
- }
- else
- LOG.debug("{} dir is excluded", entryName);
- }
- else
- LOG.debug("{} dir is NOT included", entryName);
- }
- else
- {
- //entry is a file, is it included?
- if (isIncluded(entryName))
- {
- if (!isExcluded(entryName))
- {
- // make directory (some jars don't list dirs)
- Path dir = file.getParent();
- if (!Files.exists(dir))
- Files.createDirectories(dir);
-
- // Make file
- try (OutputStream fout = Files.newOutputStream(file))
- {
- IO.copy(jin, fout);
- }
-
- // touch the file.
- if (entry.getTime() >= 0)
- Files.setLastModifiedTime(file, FileTime.fromMillis(entry.getTime()));
- }
- else
- LOG.debug("{} file is excluded", entryName);
- }
- else
- LOG.debug("{} file is NOT included", entryName);
- }
- }
-
- Manifest manifest = jin.getManifest();
- if (manifest != null)
- {
- if (isIncluded("META-INF") && !isExcluded("META-INF"))
- {
- Path metaInf = directory.resolve("META-INF");
- Files.createDirectory(metaInf);
- Path f = metaInf.resolve("MANIFEST.MF");
- try (OutputStream fout = Files.newOutputStream(f))
- {
- manifest.write(fout);
- }
- }
- }
- }
- }
-}
diff --git a/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/ServerConnectorListener.java b/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/ServerConnectorListener.java
deleted file mode 100644
index c3c534c7d503..000000000000
--- a/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/ServerConnectorListener.java
+++ /dev/null
@@ -1,111 +0,0 @@
-//
-// ========================================================================
-// Copyright (c) 1995 Mort Bay Consulting Pty Ltd and others.
-//
-// This program and the accompanying materials are made available under the
-// terms of the Eclipse Public License v. 2.0 which is available at
-// https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
-// which is available at https://www.apache.org/licenses/LICENSE-2.0.
-//
-// SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
-// ========================================================================
-//
-
-package org.eclipse.jetty.ee10.maven.plugin;
-
-import java.io.Writer;
-import java.nio.file.AtomicMoveNotSupportedException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.nio.file.StandardCopyOption;
-
-import org.eclipse.jetty.server.ServerConnector;
-import org.eclipse.jetty.util.component.AbstractLifeCycle.AbstractLifeCycleListener;
-import org.eclipse.jetty.util.component.LifeCycle;
-
-/**
- * ServerConnectorListener
- *
- * This is for test support, where we need jetty to run on a random port, and we need
- * a client to be able to find out which port was picked.
- */
-public class ServerConnectorListener extends AbstractLifeCycleListener
-{
- private String _fileName;
- private String _sysPropertyName;
-
- @Override
- public void lifeCycleStarted(LifeCycle event)
- {
- if (getFileName() != null)
- {
- try
- {
- Path tmp = Files.createTempFile("jettyport", ".tmp");
- try (Writer writer = Files.newBufferedWriter(tmp))
- {
- writer.write(String.valueOf(((ServerConnector)event).getLocalPort()));
- }
-
- Path path = Paths.get(getFileName());
- Files.deleteIfExists(path);
- try
- {
- Files.move(tmp, path, StandardCopyOption.ATOMIC_MOVE);
- }
- catch (AtomicMoveNotSupportedException e) // can append on some os (windows).. so try again without the option
- {
- Files.move(tmp, path);
- }
- }
- catch (Exception e)
- {
- throw new RuntimeException(e);
- }
- }
-
- if (getSysPropertyName() != null)
- {
- System.setProperty(_sysPropertyName, String.valueOf(((ServerConnector)event).getLocalPort()));
- }
- super.lifeCycleStarted(event);
- }
-
- /**
- * Get the file name.
- * @return the file name
- */
- public String getFileName()
- {
- return _fileName;
- }
-
- /**
- * Set the file name to set.
- * @param name the file name to set
- */
- public void setFileName(String name)
- {
-
- _fileName = name;
- }
-
- /**
- * Get the sysPropertyName.
- * @return the sysPropertyName
- */
- public String getSysPropertyName()
- {
- return _sysPropertyName;
- }
-
- /**
- * Set the sysPropertyName to set.
- * @param sysPropertyName the sysPropertyName to set
- */
- public void setSysPropertyName(String sysPropertyName)
- {
- _sysPropertyName = sysPropertyName;
- }
-}
diff --git a/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/ServerListener.java b/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/ServerListener.java
deleted file mode 100644
index 940c99d606f9..000000000000
--- a/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/ServerListener.java
+++ /dev/null
@@ -1,59 +0,0 @@
-//
-// ========================================================================
-// Copyright (c) 1995 Mort Bay Consulting Pty Ltd and others.
-//
-// This program and the accompanying materials are made available under the
-// terms of the Eclipse Public License v. 2.0 which is available at
-// https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
-// which is available at https://www.apache.org/licenses/LICENSE-2.0.
-//
-// SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
-// ========================================================================
-//
-
-package org.eclipse.jetty.ee10.maven.plugin;
-
-import java.nio.file.Files;
-import java.nio.file.Path;
-
-import org.eclipse.jetty.util.component.LifeCycle;
-
-/**
- * ServerListener
- *
- * Listener to create a file that signals that the startup is completed.
- * Used by the JettyRunHome maven goal to determine that the child
- * process is started, and that jetty is ready.
- */
-public class ServerListener implements LifeCycle.Listener
-{
- private String _tokenFile;
-
- public void setTokenFile(String file)
- {
- _tokenFile = file;
- }
-
- public String getTokenFile()
- {
- return _tokenFile;
- }
-
- @Override
- public void lifeCycleStarted(LifeCycle event)
- {
- if (_tokenFile != null)
- {
- try
- {
- // Using Path, as we need to reliably create/write a file.
- Path path = Path.of(_tokenFile);
- Files.createFile(path);
- }
- catch (Exception e)
- {
- throw new IllegalStateException(e);
- }
- }
- }
-}
diff --git a/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/ServerSupport.java b/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/ServerSupport.java
deleted file mode 100644
index f648dd6b449c..000000000000
--- a/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/ServerSupport.java
+++ /dev/null
@@ -1,236 +0,0 @@
-//
-// ========================================================================
-// Copyright (c) 1995 Mort Bay Consulting Pty Ltd and others.
-//
-// This program and the accompanying materials are made available under the
-// terms of the Eclipse Public License v. 2.0 which is available at
-// https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
-// which is available at https://www.apache.org/licenses/LICENSE-2.0.
-//
-// SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
-// ========================================================================
-//
-
-package org.eclipse.jetty.ee10.maven.plugin;
-
-import java.io.File;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.jetty.ee10.webapp.Configurations;
-import org.eclipse.jetty.ee10.webapp.WebAppContext;
-import org.eclipse.jetty.security.LoginService;
-import org.eclipse.jetty.server.Connector;
-import org.eclipse.jetty.server.RequestLog;
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.server.handler.ContextHandler;
-import org.eclipse.jetty.server.handler.ContextHandlerCollection;
-import org.eclipse.jetty.util.resource.ResourceFactory;
-import org.eclipse.jetty.xml.XmlConfiguration;
-
-/**
- * ServerSupport
- *
- * Helps configure the Server instance.
- */
-public class ServerSupport
-{
-
- public static void configureDefaultConfigurationClasses(Server server)
- {
- Configurations.setServerDefault(server);
- }
-
- /**
- * Set up the handler structure to receive a webapp.
- * Also put in a DefaultHandler so we get a nicer page
- * than a 404 if we hit the root and the webapp's
- * context isn't at root.
- *
- * @param server the server to use
- * @param contextHandlers the context handlers to include
- * @param requestLog a request log to use
- */
- public static void configureHandlers(Server server, List contextHandlers, RequestLog requestLog)
- {
- if (server == null)
- throw new IllegalArgumentException("Server is null");
-
- if (requestLog != null)
- server.setRequestLog(requestLog);
-
- ContextHandlerCollection contexts = findContextHandlerCollection(server);
- if (contexts == null)
- {
- contexts = new ContextHandlerCollection();
- server.setHandler(contexts);
- }
-
- if (contextHandlers != null)
- {
- for (ContextHandler context:contextHandlers)
- {
- contexts.addHandler(context);
- }
- }
- }
-
- /**
- * Configure at least one connector for the server
- *
- * @param server the server
- * @param connector the connector
- * @param properties jetty properties
- */
- public static void configureConnectors(Server server, Connector connector, Map properties)
- {
- if (server == null)
- throw new IllegalArgumentException("Server is null");
-
- //if a connector is provided, use it
- if (connector != null)
- {
- server.addConnector(connector);
- return;
- }
-
- // if the user hasn't configured the connectors in a jetty.xml file so use a default one
- Connector[] connectors = server.getConnectors();
- if (connectors == null || connectors.length == 0)
- {
- //Make a new default connector
- MavenServerConnector tmp = new MavenServerConnector();
- //use any jetty.http.port settings provided, trying system properties before jetty properties
- String port = System.getProperty(MavenServerConnector.PORT_SYSPROPERTY);
- if (port == null)
- port = System.getProperty("jetty.port");
- if (port == null)
- port = (properties != null ? properties.get(MavenServerConnector.PORT_SYSPROPERTY) : null);
- if (port == null)
- port = MavenServerConnector.DEFAULT_PORT_STR;
- tmp.setPort(Integer.parseInt(port.trim()));
- tmp.setServer(server);
- server.setConnectors(new Connector[]{tmp});
- }
- }
-
- /**
- * Set up any security LoginServices provided.
- *
- * @param server the server
- * @param loginServices the login services
- */
- public static void configureLoginServices(Server server, List loginServices)
- {
- if (server == null)
- throw new IllegalArgumentException("Server is null");
-
- if (loginServices != null)
- {
- for (LoginService loginService : loginServices)
- {
- PluginLog.getLog().debug(loginService.getClass().getName() + ": " + loginService.toString());
- server.addBean(loginService);
- }
- }
- }
-
- /**
- * Add a WebAppContext to a Server
- * @param server the server to use
- * @param webapp the webapp to add
- */
- public static void addWebApplication(Server server, WebAppContext webapp)
- {
- if (server == null)
- throw new IllegalArgumentException("Server is null");
- ContextHandlerCollection contexts = findContextHandlerCollection(server);
- if (contexts == null)
- throw new IllegalStateException("ContextHandlerCollection is null");
- contexts.addHandler(webapp);
- }
-
- /**
- * Locate a ContextHandlerCollection for a Server.
- *
- * @param server the Server to check.
- * @return The ContextHandlerCollection or null if not found.
- */
- public static ContextHandlerCollection findContextHandlerCollection(Server server)
- {
- if (server == null)
- return null;
-
- return server.getDescendant(ContextHandlerCollection.class);
- }
-
- /**
- * Apply xml files to server instance.
- *
- * @param server the server to apply the xml to
- * @param files the list of xml files
- * @param properties list of jetty properties
- * @return the Server implementation, after the xml is applied
- * @throws Exception if unable to apply the xml configuration
- */
- public static Server applyXmlConfigurations(Server server, List files, Map properties)
- throws Exception
- {
- if (files == null || files.isEmpty())
- return server;
-
- Map lastMap = new HashMap<>();
-
- if (server != null)
- lastMap.put("Server", server);
-
- for (File xmlFile : files)
- {
- if (PluginLog.getLog() != null)
- PluginLog.getLog().info("Configuring Jetty from xml configuration file = " + xmlFile.getCanonicalPath());
-
- XmlConfiguration xmlConfiguration = new XmlConfiguration(ResourceFactory.of(server).newResource(xmlFile.toPath()));
-
- //add in any properties
- if (properties != null)
- {
- for (Map.Entry e : properties.entrySet())
- {
- xmlConfiguration.getProperties().put(e.getKey(), e.getValue());
- }
- }
-
- //chain ids from one config file to another
- if (lastMap != null)
- xmlConfiguration.getIdMap().putAll(lastMap);
-
- //Set the system properties each time in case the config file set a new one
- Enumeration> ensysprop = System.getProperties().propertyNames();
- while (ensysprop.hasMoreElements())
- {
- String name = (String)ensysprop.nextElement();
- xmlConfiguration.getProperties().put(name, System.getProperty(name));
- }
- xmlConfiguration.configure();
- lastMap = xmlConfiguration.getIdMap();
- }
-
- return (Server)lastMap.get("Server");
- }
-
- /**
- * Apply xml files to server instance.
- *
- * @param server the Server instance to configure
- * @param files the xml configs to apply
- * @return the Server after application of configs
- * @throws Exception if there is an unspecified problem
- */
- public static Server applyXmlConfigurations(Server server, List files)
- throws Exception
- {
- return applyXmlConfigurations(server, files, null);
- }
-}
diff --git a/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/WarPluginInfo.java b/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/WarPluginInfo.java
deleted file mode 100644
index 78b566f14e19..000000000000
--- a/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/WarPluginInfo.java
+++ /dev/null
@@ -1,239 +0,0 @@
-//
-// ========================================================================
-// Copyright (c) 1995 Mort Bay Consulting Pty Ltd and others.
-//
-// This program and the accompanying materials are made available under the
-// terms of the Eclipse Public License v. 2.0 which is available at
-// https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
-// which is available at https://www.apache.org/licenses/LICENSE-2.0.
-//
-// SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
-// ========================================================================
-//
-
-package org.eclipse.jetty.ee10.maven.plugin;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Optional;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-import org.apache.maven.artifact.Artifact;
-import org.apache.maven.model.Plugin;
-import org.apache.maven.project.MavenProject;
-import org.codehaus.plexus.util.xml.Xpp3Dom;
-import org.eclipse.jetty.util.StringUtil;
-
-/**
- * WarPluginInfo
- *
- * Information about the maven-war-plugin contained in the pom
- */
-public class WarPluginInfo
-{
- private MavenProject _project;
- private Plugin _plugin;
- private List _dependentMavenWarIncludes;
- private List _dependentMavenWarExcludes;
- private List _overlayConfigs;
- private Set _warArtifacts;
-
- public WarPluginInfo(MavenProject project)
- {
- _project = project;
- if (_project.getArtifacts() != null)
- {
- _warArtifacts = _project.getArtifacts()
- .stream()
- .filter(a -> "war".equals(a.getType()) || "zip".equals(a.getType())).collect(Collectors.toSet());
- }
- else
- _warArtifacts = Collections.emptySet();
- }
-
- /**
- * Get the project.
- * @return the project
- */
- public MavenProject getProject()
- {
- return _project;
- }
-
- /**
- * Get all dependent artifacts that are wars.
- * @return all artifacts of type "war" or "zip"
- */
- public Set getWarArtifacts()
- {
- return _warArtifacts;
- }
-
- /**
- * Get an artifact of type war that matches the given coordinates.
- * @param groupId the groupId to match
- * @param artifactId the artifactId to match
- * @param classifier the classified to match
- * @return the matching Artifact or null if no match
- */
- public Artifact getWarArtifact(String groupId, String artifactId, String classifier)
- {
- Optional o = _warArtifacts.stream()
- .filter(a -> match(a, groupId, artifactId, classifier)).findFirst();
- return o.orElse(null);
- }
-
- /**
- * Find the maven-war-plugin, if one is configured
- *
- * @return the plugin
- */
- public Plugin getWarPlugin()
- {
- if (_plugin == null)
- {
- List plugins = _project.getBuildPlugins();
- if (plugins == null)
- return null;
-
- for (Plugin p : plugins)
- {
- if ("maven-war-plugin".equals(p.getArtifactId()))
- {
- _plugin = p;
- break;
- }
- }
- }
- return _plugin;
- }
-
- /**
- * Get value of dependentWarIncludes for maven-war-plugin
- *
- * @return the list of dependent war includes
- */
- public List getDependentMavenWarIncludes()
- {
- if (_dependentMavenWarIncludes == null)
- {
- getWarPlugin();
-
- if (_plugin == null)
- return null;
-
- Xpp3Dom node = (Xpp3Dom)_plugin.getConfiguration();
- if (node == null)
- return null;
-
- node = node.getChild("dependentWarIncludes");
- if (node == null)
- return null;
- String val = node.getValue();
- _dependentMavenWarIncludes = StringUtil.csvSplit(null, val, 0, val.length());
- }
- return _dependentMavenWarIncludes;
- }
-
- /**
- * Get value of dependentWarExcludes for maven-war-plugin
- *
- * @return the list of dependent war excludes
- */
- public List getDependentMavenWarExcludes()
- {
- if (_dependentMavenWarExcludes == null)
- {
- getWarPlugin();
-
- if (_plugin == null)
- return null;
-
- Xpp3Dom node = (Xpp3Dom)_plugin.getConfiguration();
- if (node == null)
- return null;
-
- node = node.getChild("dependentWarExcludes");
- if (node == null)
- return null;
- String val = node.getValue();
- _dependentMavenWarExcludes = StringUtil.csvSplit(null, val, 0, val.length());
- }
- return _dependentMavenWarExcludes;
- }
-
- /**
- * Get config for any overlays that have been declared for the maven-war-plugin.
- *
- * @return the list of overlay configs
- */
- public List getMavenWarOverlayConfigs()
- {
- if (_overlayConfigs == null)
- {
- getWarPlugin();
-
- if (_plugin == null)
- return Collections.emptyList();
-
- getDependentMavenWarIncludes();
- getDependentMavenWarExcludes();
-
- Xpp3Dom node = (Xpp3Dom)_plugin.getConfiguration();
- if (node == null)
- return Collections.emptyList();
-
- node = node.getChild("overlays");
- if (node == null)
- return Collections.emptyList();
-
- Xpp3Dom[] nodes = node.getChildren("overlay");
- if (nodes == null)
- return Collections.emptyList();
-
- _overlayConfigs = new ArrayList();
- for (int i = 0; i < nodes.length; i++)
- {
- OverlayConfig overlayConfig = new OverlayConfig(nodes[i], _dependentMavenWarIncludes, _dependentMavenWarExcludes);
- _overlayConfigs.add(overlayConfig);
- }
- }
-
- return _overlayConfigs;
- }
-
- public boolean match(Artifact a, String gid, String aid, String cls)
- {
- if (a == null)
- return (gid == null && aid == null && cls == null);
-
- if (((a.getGroupId() == null && gid == null) || (a.getGroupId() != null && a.getGroupId().equals(gid))) &&
- ((a.getArtifactId() == null && aid == null) || (a.getArtifactId() != null && a.getArtifactId().equals(aid))) &&
- ((a.getClassifier() == null) || (a.getClassifier().equals(cls))))
- return true;
-
- return false;
- }
-
- /**
- * Check if the given artifact matches the group and artifact coordinates.
- *
- * @param a the artifact to check
- * @param gid the group id
- * @param aid the artifact id
- * @return true if matched false otherwise
- */
- public boolean match(Artifact a, String gid, String aid)
- {
- if (a == null)
- return (gid == null && aid == null);
-
- if (((a.getGroupId() == null && gid == null) || (a.getGroupId() != null && a.getGroupId().equals(gid))) &&
- ((a.getArtifactId() == null && aid == null) || (a.getArtifactId() != null && a.getArtifactId().equals(aid))))
- return true;
-
- return false;
- }
-}
diff --git a/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/utils/MavenProjectHelper.java b/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/utils/MavenProjectHelper.java
deleted file mode 100644
index 1f0c7197ea5a..000000000000
--- a/jetty-ee10/jetty-ee10-maven-plugin/src/main/java/org/eclipse/jetty/ee10/maven/plugin/utils/MavenProjectHelper.java
+++ /dev/null
@@ -1,185 +0,0 @@
-//
-// ========================================================================
-// Copyright (c) 1995 Mort Bay Consulting Pty Ltd and others.
-//
-// This program and the accompanying materials are made available under the
-// terms of the Eclipse Public License v. 2.0 which is available at
-// https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
-// which is available at https://www.apache.org/licenses/LICENSE-2.0.
-//
-// SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
-// ========================================================================
-//
-
-package org.eclipse.jetty.ee10.maven.plugin.utils;
-
-import java.io.File;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.function.Function;
-import java.util.stream.Collectors;
-
-import org.apache.maven.RepositoryUtils;
-import org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.repository.ArtifactRepository;
-import org.apache.maven.execution.MavenSession;
-import org.apache.maven.project.MavenProject;
-import org.eclipse.aether.RepositorySystem;
-import org.eclipse.aether.artifact.DefaultArtifact;
-import org.eclipse.aether.resolution.ArtifactRequest;
-import org.eclipse.aether.resolution.ArtifactResolutionException;
-import org.eclipse.aether.resolution.ArtifactResult;
-import org.eclipse.jetty.ee10.maven.plugin.OverlayManager;
-import org.eclipse.jetty.ee10.maven.plugin.WarPluginInfo;
-
-/**
- * MavenProjectHelper
- *
- * A class to facilitate interacting with the build time maven environment.
- */
-public class MavenProjectHelper
-{
- private MavenProject project;
- private RepositorySystem repositorySystem;
- private List remoteRepositories;
- private MavenSession session;
- private final Map artifactToReactorProjectMap;
- /**
- * maven-war-plugin reference
- */
- private WarPluginInfo warPluginInfo;
-
- /**
- * Helper for wrangling war overlays
- */
- private OverlayManager overlayManager;
-
- /**
- * @param project the project being built
- * @param repositorySystem a resolve for artifacts
- * @param remoteRepositories repositories from which to resolve artifacts
- * @param session the current maven build session
- */
- public MavenProjectHelper(MavenProject project, RepositorySystem repositorySystem, List remoteRepositories, MavenSession session)
- {
- this.project = project;
- this.repositorySystem = repositorySystem;
- this.remoteRepositories = remoteRepositories;
- this.session = session;
- //work out which dependent projects are in the reactor
- Set mavenProjects = findDependenciesInReactor(project, new HashSet<>());
- artifactToReactorProjectMap = mavenProjects.stream()
- .collect(Collectors.toMap(MavenProject::getId, Function.identity()));
- artifactToReactorProjectMap.put(project.getArtifact().getId(), project);
- warPluginInfo = new WarPluginInfo(project);
- overlayManager = new OverlayManager(warPluginInfo);
- }
-
- public MavenProject getProject()
- {
- return this.project;
- }
-
- public WarPluginInfo getWarPluginInfo()
- {
- return warPluginInfo;
- }
-
- public OverlayManager getOverlayManager()
- {
- return overlayManager;
- }
-
- /**
- * Gets the maven project represented by the artifact iff it is in
- * the reactor.
- *
- * @param artifact the artifact of the project to get
- * @return {@link MavenProject} if artifact is referenced in reactor, otherwise null
- */
- public MavenProject getMavenProjectFor(Artifact artifact)
- {
- if (artifact == null)
- return null;
- return artifactToReactorProjectMap.get(artifact.getId());
- }
-
- /**
- * Gets path to artifact.
- * If the artifact is referenced in the reactor, returns path to ${project.build.outputDirectory}.
- * Otherwise, returns path to location in local m2 repo.
- *
- * Cannot return null - maven will complain about unsatisfied dependency during project build.
- *
- * @param artifact maven artifact to check
- * @return path to artifact
- */
- public Path getPathFor(Artifact artifact)
- {
- Path path = artifact.getFile().toPath();
- MavenProject mavenProject = getMavenProjectFor(artifact);
- if (mavenProject != null)
- {
- if ("test-jar".equals(artifact.getType()))
- {
- path = Paths.get(mavenProject.getBuild().getTestOutputDirectory());
- }
- else
- {
- path = Paths.get(mavenProject.getBuild().getOutputDirectory());
- }
- }
- return path;
- }
-
- /**
- * Given the coordinates for an artifact, resolve the artifact from the
- * remote repositories.
- *
- * @param groupId the groupId of the artifact to resolve
- * @param artifactId the artifactId of the artifact to resolve
- * @param version the version of the artifact to resolve
- * @param type the type of the artifact to resolve
- * @return a File representing the location of the artifact or null if not resolved
- */
- public File resolveArtifact(String groupId, String artifactId, String version, String type)
- throws ArtifactResolutionException
- {
- ArtifactRequest request = new ArtifactRequest();
- request.setRepositories(RepositoryUtils.toRepos(remoteRepositories));
- request.setArtifact(new DefaultArtifact(groupId, artifactId, "", type, version));
- ArtifactResult result = repositorySystem.resolveArtifact(session.getRepositorySession(), request);
-
- if (result.isResolved())
- return result.getArtifact().getFile();
- return null;
- }
-
- /**
- * Recursively find projects in the reactor for all dependencies of the given project.
- *
- * @param project the project for which to find dependencies that are in the reactor
- * @param visitedProjects the set of projects already seen
- * @return unified set of all related projects in the reactor
- */
- private static Set findDependenciesInReactor(MavenProject project, Set visitedProjects)
- {
- if (visitedProjects.contains(project))
- return Collections.emptySet();
-
- visitedProjects.add(project);
- Collection refs = project.getProjectReferences().values();
- Set availableProjects = new HashSet<>(refs);
- for (MavenProject ref : refs)
- {
- availableProjects.addAll(findDependenciesInReactor(ref, visitedProjects));
- }
- return availableProjects;
- }
-}
diff --git a/jetty-ee10/jetty-ee10-maven-plugin/src/main/resources/ee10-maven.mod b/jetty-ee10/jetty-ee10-maven-plugin/src/main/resources/ee10-maven.mod
index 344d4aaaa825..ab4ed52419b7 100644
--- a/jetty-ee10/jetty-ee10-maven-plugin/src/main/resources/ee10-maven.mod
+++ b/jetty-ee10/jetty-ee10-maven-plugin/src/main/resources/ee10-maven.mod
@@ -12,7 +12,7 @@ ee10-webapp
ee10-annotations
[lib]
-lib/maven-ee10/*.jar
+lib/ee10-maven/*.jar
[xml]
etc/jetty-ee10-maven.xml
diff --git a/jetty-ee10/jetty-ee10-maven-plugin/src/main/resources/jetty-ee10-maven.xml b/jetty-ee10/jetty-ee10-maven-plugin/src/main/resources/jetty-ee10-maven.xml
index d1ba792557f2..b83be87a6474 100644
--- a/jetty-ee10/jetty-ee10-maven-plugin/src/main/resources/jetty-ee10-maven.xml
+++ b/jetty-ee10/jetty-ee10-maven-plugin/src/main/resources/jetty-ee10-maven.xml
@@ -4,7 +4,7 @@
-
+
diff --git a/jetty-ee10/jetty-ee10-maven-plugin/src/test/java/org/eclipse/jetty/ee10/maven/plugin/TestForkedChild.java b/jetty-ee10/jetty-ee10-maven-plugin/src/test/java/org/eclipse/jetty/ee10/maven/plugin/TestForkedChild.java
index b2cc8e5f9c85..8e13f6fcb2ed 100644
--- a/jetty-ee10/jetty-ee10-maven-plugin/src/test/java/org/eclipse/jetty/ee10/maven/plugin/TestForkedChild.java
+++ b/jetty-ee10/jetty-ee10-maven-plugin/src/test/java/org/eclipse/jetty/ee10/maven/plugin/TestForkedChild.java
@@ -88,7 +88,7 @@ public void run()
webapp.setBaseResourceAsPath(baseDir.toPath());
WebAppPropertyConverter.toProperties(webapp, webappPropsFile, null);
child = new JettyForkedChild(cmd.toArray(new String[0]));
- child.jetty.setExitVm(false); //ensure jetty doesn't stop vm for testing
+ child.getJettyEmbedder().setExitVm(false); //ensure jetty doesn't stop vm for testing
child.start();
}
catch (Exception e)
diff --git a/jetty-ee10/jetty-ee10-maven-plugin/src/test/java/org/eclipse/jetty/ee10/maven/plugin/TestJettyEmbedder.java b/jetty-ee10/jetty-ee10-maven-plugin/src/test/java/org/eclipse/jetty/ee10/maven/plugin/TestJettyEmbedder.java
index 7cbd78e1c09a..b5bf18ed1f04 100644
--- a/jetty-ee10/jetty-ee10-maven-plugin/src/test/java/org/eclipse/jetty/ee10/maven/plugin/TestJettyEmbedder.java
+++ b/jetty-ee10/jetty-ee10-maven-plugin/src/test/java/org/eclipse/jetty/ee10/maven/plugin/TestJettyEmbedder.java
@@ -19,6 +19,8 @@
import java.util.Map;
import org.eclipse.jetty.ee10.servlet.ListenerHolder;
+import org.eclipse.jetty.maven.MavenServerConnector;
+import org.eclipse.jetty.maven.ServerSupport;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.ContextHandler;
import org.eclipse.jetty.server.handler.ContextHandlerCollection;
@@ -119,7 +121,7 @@ public void testJettyEmbedder(WorkDir workDir)
assertTrue(contexts.contains(webApp));
//stop the webapp and check durable listener retained
- jetty.getWebApp().stop();
+ jetty.stopWebApp();
boolean someListener = false;
for (ListenerHolder h : webApp.getServletHandler().getListeners())
{
diff --git a/jetty-ee10/jetty-ee10-maven-plugin/src/test/java/org/eclipse/jetty/ee10/maven/plugin/TestSelectiveJarResource.java b/jetty-ee10/jetty-ee10-maven-plugin/src/test/java/org/eclipse/jetty/ee10/maven/plugin/TestSelectiveJarResource.java
index 2fb56640d908..483eb28668df 100644
--- a/jetty-ee10/jetty-ee10-maven-plugin/src/test/java/org/eclipse/jetty/ee10/maven/plugin/TestSelectiveJarResource.java
+++ b/jetty-ee10/jetty-ee10-maven-plugin/src/test/java/org/eclipse/jetty/ee10/maven/plugin/TestSelectiveJarResource.java
@@ -18,6 +18,7 @@
import java.util.ArrayList;
import java.util.List;
+import org.eclipse.jetty.maven.SelectiveJarResource;
import org.eclipse.jetty.toolchain.test.MavenTestingUtils;
import org.eclipse.jetty.toolchain.test.jupiter.WorkDir;
import org.eclipse.jetty.toolchain.test.jupiter.WorkDirExtension;
diff --git a/jetty-ee10/jetty-ee10-servlet/src/main/java/org/eclipse/jetty/ee10/servlet/ServletChannel.java b/jetty-ee10/jetty-ee10-servlet/src/main/java/org/eclipse/jetty/ee10/servlet/ServletChannel.java
index 34d1709b829d..40a20921cc39 100644
--- a/jetty-ee10/jetty-ee10-servlet/src/main/java/org/eclipse/jetty/ee10/servlet/ServletChannel.java
+++ b/jetty-ee10/jetty-ee10-servlet/src/main/java/org/eclipse/jetty/ee10/servlet/ServletChannel.java
@@ -279,7 +279,9 @@ public Request getRequest()
public ServletContextResponse getServletContextResponse()
{
ServletContextRequest request = _servletContextRequest;
- return request == null ? null : request.getServletContextResponse();
+ if (_servletContextRequest == null)
+ throw new IllegalStateException("Request/Response does not exist (likely recycled)");
+ return request.getServletContextResponse();
}
/**
@@ -291,6 +293,8 @@ public ServletContextResponse getServletContextResponse()
*/
public Response getResponse()
{
+ if (_response == null)
+ throw new IllegalStateException("Response does not exist (likely recycled)");
return _response;
}
diff --git a/jetty-ee10/jetty-ee10-servlet/src/test/java/org/eclipse/jetty/ee10/servlet/ServletContextHandlerTest.java b/jetty-ee10/jetty-ee10-servlet/src/test/java/org/eclipse/jetty/ee10/servlet/ServletContextHandlerTest.java
index b29f7bb0b2eb..83a96c69fba0 100644
--- a/jetty-ee10/jetty-ee10-servlet/src/test/java/org/eclipse/jetty/ee10/servlet/ServletContextHandlerTest.java
+++ b/jetty-ee10/jetty-ee10-servlet/src/test/java/org/eclipse/jetty/ee10/servlet/ServletContextHandlerTest.java
@@ -79,6 +79,7 @@
import org.eclipse.jetty.server.LocalConnector;
import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.Response;
+import org.eclipse.jetty.server.ResponseUtils;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.ContextHandler;
import org.eclipse.jetty.server.handler.ContextHandlerCollection;
@@ -103,6 +104,7 @@
import static org.hamcrest.Matchers.containsInAnyOrder;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.instanceOf;
+import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.notNullValue;
import static org.hamcrest.Matchers.nullValue;
import static org.hamcrest.Matchers.sameInstance;
@@ -692,6 +694,31 @@ public void destroyServer() throws Exception
_server.join();
}
+ @Test
+ public void testEnsureNotPersistent() throws Exception
+ {
+ ServletContextHandler root = new ServletContextHandler("/", ServletContextHandler.SESSIONS);
+ root.setContextPath("/");
+ root.addServlet(new ServletHolder(new HttpServlet()
+ {
+ @Override
+ protected void doGet(HttpServletRequest req, HttpServletResponse resp)
+ {
+ Request request = ((ServletApiRequest)req).getRequest();
+ Response response = ((ServletApiResponse)resp).getResponse();
+
+ ResponseUtils.ensureNotPersistent(request, response);
+ }
+ }), "/ensureNotPersistent");
+ _server.setHandler(root);
+
+ _server.start();
+
+ String rawResponse = _connector.getResponse("GET /ensureNotPersistent HTTP/1.0\r\n\r\n");
+ HttpTester.Response response = HttpTester.parseResponse(rawResponse);
+ assertThat(response.getStatus(), is(200));
+ }
+
@Test
public void testInitParams() throws Exception
{
diff --git a/jetty-ee10/jetty-ee10-tests/jetty-ee10-test-sessions/jetty-ee10-test-sessions-common/src/test/java/org/eclipse/jetty/ee10/session/CreationTest.java b/jetty-ee10/jetty-ee10-tests/jetty-ee10-test-sessions/jetty-ee10-test-sessions-common/src/test/java/org/eclipse/jetty/ee10/session/CreationTest.java
index 83148ef4b3db..8e829ba48338 100644
--- a/jetty-ee10/jetty-ee10-tests/jetty-ee10-test-sessions/jetty-ee10-test-sessions-common/src/test/java/org/eclipse/jetty/ee10/session/CreationTest.java
+++ b/jetty-ee10/jetty-ee10-tests/jetty-ee10-test-sessions/jetty-ee10-test-sessions-common/src/test/java/org/eclipse/jetty/ee10/session/CreationTest.java
@@ -200,7 +200,7 @@ public void testSessionCreateAndInvalidateNoSave() throws Exception
assertEquals(HttpServletResponse.SC_OK, response.getStatus());
//check that the session does not exist
- assertFalse(contextHandler.getSessionHandler().getSessionCache().getSessionDataStore().exists(servlet._id));
+ Awaitility.waitAtMost(5, TimeUnit.SECONDS).until(() -> !contextHandler.getSessionHandler().getSessionCache().getSessionDataStore().exists(servlet._id));
}
finally
{
@@ -245,7 +245,7 @@ public void testSessionCreateAndInvalidateWithSave() throws Exception
assertEquals(HttpServletResponse.SC_OK, response.getStatus());
//check that the session does not exist
- assertFalse(contextHandler.getSessionHandler().getSessionCache().getSessionDataStore().exists(servlet._id));
+ Awaitility.waitAtMost(5, TimeUnit.SECONDS).until(() -> !contextHandler.getSessionHandler().getSessionCache().getSessionDataStore().exists(servlet._id));
}
finally
{
@@ -287,8 +287,8 @@ public void testSessionCreateInvalidateCreate() throws Exception
ContentResponse response = client.GET(url);
assertEquals(HttpServletResponse.SC_OK, response.getStatus());
- //check that the session does not exist
- assertTrue(contextHandler.getSessionHandler().getSessionCache().getSessionDataStore().exists(servlet._id));
+ //check the session
+ Awaitility.waitAtMost(5, TimeUnit.SECONDS).until(() -> contextHandler.getSessionHandler().getSessionCache().getSessionDataStore().exists(servlet._id));
assertThat(response.getHeaders().getValuesList(HttpHeader.SET_COOKIE).size(), Matchers.is(1));
}
finally
@@ -338,8 +338,8 @@ public void testSessionCreateForward() throws Exception
assertEquals(HttpServletResponse.SC_OK, response.getStatus());
//check that the sessions exist persisted
- assertTrue(contextHandler.getSessionHandler().getSessionCache().getSessionDataStore().exists(servlet._id));
- assertTrue(ctxB.getSessionHandler().getSessionCache().getSessionDataStore().exists(servlet._id));
+ Awaitility.waitAtMost(5, TimeUnit.SECONDS).until(() -> contextHandler.getSessionHandler().getSessionCache().getSessionDataStore().exists(servlet._id));
+ Awaitility.waitAtMost(5, TimeUnit.SECONDS).until(() -> ctxB.getSessionHandler().getSessionCache().getSessionDataStore().exists(servlet._id));
}
finally
{
@@ -387,9 +387,9 @@ public void testSessionCreateForwardAndInvalidate() throws Exception
ContentResponse response = client.GET(url + "?action=forwardinv");
assertEquals(HttpServletResponse.SC_OK, response.getStatus());
- //check that the session does not exist
- assertFalse(contextHandler.getSessionHandler().getSessionCache().getSessionDataStore().exists(servlet._id));
- assertFalse(ctxB.getSessionHandler().getSessionCache().getSessionDataStore().exists(servlet._id));
+ //check that the session does not exist
+ Awaitility.waitAtMost(5, TimeUnit.SECONDS).until(() -> !contextHandler.getSessionHandler().getSessionCache().getSessionDataStore().exists(servlet._id));
+ Awaitility.waitAtMost(5, TimeUnit.SECONDS).until(() -> !ctxB.getSessionHandler().getSessionCache().getSessionDataStore().exists(servlet._id));
}
finally
{
diff --git a/jetty-ee10/jetty-ee10-tests/jetty-ee10-test-sessions/jetty-ee10-test-sessions-mongodb/src/test/java/org/eclipse/jetty/ee10/session/nosql/mongodb/AttributeNameTest.java b/jetty-ee10/jetty-ee10-tests/jetty-ee10-test-sessions/jetty-ee10-test-sessions-mongodb/src/test/java/org/eclipse/jetty/ee10/session/nosql/mongodb/AttributeNameTest.java
index 882b51357988..1a3493a8e7a7 100644
--- a/jetty-ee10/jetty-ee10-tests/jetty-ee10-test-sessions/jetty-ee10-test-sessions-mongodb/src/test/java/org/eclipse/jetty/ee10/session/nosql/mongodb/AttributeNameTest.java
+++ b/jetty-ee10/jetty-ee10-tests/jetty-ee10-test-sessions/jetty-ee10-test-sessions-mongodb/src/test/java/org/eclipse/jetty/ee10/session/nosql/mongodb/AttributeNameTest.java
@@ -77,6 +77,7 @@ public void testAttributeNamesWithDots() throws Exception
DefaultSessionCacheFactory cacheFactory = new DefaultSessionCacheFactory();
cacheFactory.setEvictionPolicy(SessionCache.NEVER_EVICT);
+ cacheFactory.setSaveOnCreate(true);
MongoSessionDataStoreFactory storeFactory = MongoTestHelper.newSessionDataStoreFactory(DB_NAME, COLLECTION_NAME);
storeFactory.setGracePeriodSec(scavengePeriod);
diff --git a/jetty-ee8/jetty-ee8-maven-plugin/pom.xml b/jetty-ee8/jetty-ee8-maven-plugin/pom.xml
index fc9eaf2a258c..cf75ae8a06d8 100644
--- a/jetty-ee8/jetty-ee8-maven-plugin/pom.xml
+++ b/jetty-ee8/jetty-ee8-maven-plugin/pom.xml
@@ -86,6 +86,10 @@
jetty-jndi
true
]
+
+ org.eclipse.jetty
+ jetty-maven
+
org.eclipse.jetty
jetty-server
diff --git a/jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-cdi-start-forked/src/main/jetty/jetty.xml b/jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-cdi-start-forked/src/main/jetty/jetty.xml
index 5ce14c43a125..8a8f26b49f4f 100644
--- a/jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-cdi-start-forked/src/main/jetty/jetty.xml
+++ b/jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-cdi-start-forked/src/main/jetty/jetty.xml
@@ -26,7 +26,7 @@
-
+
diff --git a/jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-maven-plugin-provided-module-dep/web/src/config/jetty.xml b/jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-maven-plugin-provided-module-dep/web/src/config/jetty.xml
index 96f41b96416b..ef0c9bcad939 100644
--- a/jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-maven-plugin-provided-module-dep/web/src/config/jetty.xml
+++ b/jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-maven-plugin-provided-module-dep/web/src/config/jetty.xml
@@ -32,7 +32,7 @@
-
+
diff --git a/jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-run-mojo-jar-scan-it/MyWebApp/src/config/jetty.xml b/jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-run-mojo-jar-scan-it/MyWebApp/src/config/jetty.xml
index 0bdfe18d5250..343f5e7f99b1 100644
--- a/jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-run-mojo-jar-scan-it/MyWebApp/src/config/jetty.xml
+++ b/jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-run-mojo-jar-scan-it/MyWebApp/src/config/jetty.xml
@@ -26,7 +26,7 @@
-
+
diff --git a/jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-start-distro-mojo-it/jetty-simple-webapp/src/base/etc/test-jetty-ee8.xml b/jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-start-distro-mojo-it/jetty-simple-webapp/src/base/etc/test-jetty-ee8.xml
index 768db9db9267..9857cb546ef7 100644
--- a/jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-start-distro-mojo-it/jetty-simple-webapp/src/base/etc/test-jetty-ee8.xml
+++ b/jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-start-distro-mojo-it/jetty-simple-webapp/src/base/etc/test-jetty-ee8.xml
@@ -5,7 +5,7 @@
[
-
+
diff --git a/jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-start-forked-mojo-it/jetty-simple-webapp/src/config/jetty.xml b/jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-start-forked-mojo-it/jetty-simple-webapp/src/config/jetty.xml
index 0bdfe18d5250..343f5e7f99b1 100644
--- a/jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-start-forked-mojo-it/jetty-simple-webapp/src/config/jetty.xml
+++ b/jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-start-forked-mojo-it/jetty-simple-webapp/src/config/jetty.xml
@@ -26,7 +26,7 @@
-
+
diff --git a/jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-start-gwt-it/beer-server/src/config/jetty.xml b/jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-start-gwt-it/beer-server/src/config/jetty.xml
index 0bdfe18d5250..343f5e7f99b1 100644
--- a/jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-start-gwt-it/beer-server/src/config/jetty.xml
+++ b/jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-start-gwt-it/beer-server/src/config/jetty.xml
@@ -26,7 +26,7 @@
-
+
diff --git a/jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/pom.xml b/jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/pom.xml
index e8e0e40b0056..94439d89a518 100644
--- a/jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/pom.xml
+++ b/jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/pom.xml
@@ -140,7 +140,7 @@
-
+
${basedir}/src/config/login.xml
diff --git a/jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/config/jetty.xml b/jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/config/jetty.xml
index 0bdfe18d5250..343f5e7f99b1 100644
--- a/jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/config/jetty.xml
+++ b/jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/config/jetty.xml
@@ -26,7 +26,7 @@
-
+
diff --git a/jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-start-mojo-multi-module-single-war-it/webapp-war/src/config/jetty.xml b/jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-start-mojo-multi-module-single-war-it/webapp-war/src/config/jetty.xml
index 0bdfe18d5250..343f5e7f99b1 100644
--- a/jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-start-mojo-multi-module-single-war-it/webapp-war/src/config/jetty.xml
+++ b/jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-start-mojo-multi-module-single-war-it/webapp-war/src/config/jetty.xml
@@ -26,7 +26,7 @@
-
+
diff --git a/jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-start-war-distro-mojo-it/jetty-simple-webapp/src/base/etc/test-jetty-ee8.xml b/jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-start-war-distro-mojo-it/jetty-simple-webapp/src/base/etc/test-jetty-ee8.xml
index 768db9db9267..9857cb546ef7 100644
--- a/jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-start-war-distro-mojo-it/jetty-simple-webapp/src/base/etc/test-jetty-ee8.xml
+++ b/jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-start-war-distro-mojo-it/jetty-simple-webapp/src/base/etc/test-jetty-ee8.xml
@@ -5,7 +5,7 @@
][
-
+
diff --git a/jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-start-war-forked-mojo-it/jetty-simple-webapp/src/config/jetty.xml b/jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-start-war-forked-mojo-it/jetty-simple-webapp/src/config/jetty.xml
index 0bdfe18d5250..343f5e7f99b1 100644
--- a/jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-start-war-forked-mojo-it/jetty-simple-webapp/src/config/jetty.xml
+++ b/jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-start-war-forked-mojo-it/jetty-simple-webapp/src/config/jetty.xml
@@ -26,7 +26,7 @@
-
+
diff --git a/jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-start-war-mojo-it/src/config/jetty.xml b/jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-start-war-mojo-it/src/config/jetty.xml
index 0bdfe18d5250..343f5e7f99b1 100644
--- a/jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-start-war-mojo-it/src/config/jetty.xml
+++ b/jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-start-war-mojo-it/src/config/jetty.xml
@@ -26,7 +26,7 @@
-
+
diff --git a/jetty-ee8/jetty-ee8-maven-plugin/src/main/resources/ee8-maven.mod b/jetty-ee8/jetty-ee8-maven-plugin/src/main/resources/ee8-maven.mod
index e7f649493219..e16db22ed87b 100644
--- a/jetty-ee8/jetty-ee8-maven-plugin/src/main/resources/ee8-maven.mod
+++ b/jetty-ee8/jetty-ee8-maven-plugin/src/main/resources/ee8-maven.mod
@@ -12,7 +12,7 @@ ee8-webapp
ee8-annotations
[lib]
-lib/maven-ee8/**.jar
+lib/ee8-maven/**.jar
[xml]
etc/jetty-ee8-maven.xml
diff --git a/jetty-ee8/jetty-ee8-maven-plugin/src/main/resources/jetty-ee8-maven.xml b/jetty-ee8/jetty-ee8-maven-plugin/src/main/resources/jetty-ee8-maven.xml
index eb334cbc683a..b83be87a6474 100644
--- a/jetty-ee8/jetty-ee8-maven-plugin/src/main/resources/jetty-ee8-maven.xml
+++ b/jetty-ee8/jetty-ee8-maven-plugin/src/main/resources/jetty-ee8-maven.xml
@@ -4,7 +4,7 @@
-
+
diff --git a/jetty-ee9/jetty-ee9-maven-plugin/pom.xml b/jetty-ee9/jetty-ee9-maven-plugin/pom.xml
index 25932a6e5386..c7f54003b097 100644
--- a/jetty-ee9/jetty-ee9-maven-plugin/pom.xml
+++ b/jetty-ee9/jetty-ee9-maven-plugin/pom.xml
@@ -81,6 +81,11 @@
jetty-jndi
true
]
+
+ org.eclipse.jetty
+ jetty-maven
+ true
+
org.eclipse.jetty
jetty-server
diff --git a/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-cdi-start-forked/src/main/jetty/jetty.xml b/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-cdi-start-forked/src/main/jetty/jetty.xml
index 1bb69f935a70..8a8f26b49f4f 100644
--- a/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-cdi-start-forked/src/main/jetty/jetty.xml
+++ b/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-cdi-start-forked/src/main/jetty/jetty.xml
@@ -26,7 +26,7 @@
-
+
diff --git a/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-combinedresource-it/src/config/jetty.xml b/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-combinedresource-it/src/config/jetty.xml
index b2e4ff6a33ef..343f5e7f99b1 100644
--- a/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-combinedresource-it/src/config/jetty.xml
+++ b/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-combinedresource-it/src/config/jetty.xml
@@ -26,7 +26,7 @@
-
+
diff --git a/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-effective-web-xml-it/webapp-war/src/config/jetty.xml b/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-effective-web-xml-it/webapp-war/src/config/jetty.xml
index 4e43b5305dfb..343f5e7f99b1 100644
--- a/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-effective-web-xml-it/webapp-war/src/config/jetty.xml
+++ b/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-effective-web-xml-it/webapp-war/src/config/jetty.xml
@@ -26,7 +26,7 @@
-
+
diff --git a/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-maven-plugin-provided-module-dep/web/src/config/jetty.xml b/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-maven-plugin-provided-module-dep/web/src/config/jetty.xml
index 3ab59a4b5cb6..ef0c9bcad939 100644
--- a/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-maven-plugin-provided-module-dep/web/src/config/jetty.xml
+++ b/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-maven-plugin-provided-module-dep/web/src/config/jetty.xml
@@ -32,7 +32,7 @@
-
+
diff --git a/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-run-mojo-jar-scan-it/MyWebApp/src/config/jetty.xml b/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-run-mojo-jar-scan-it/MyWebApp/src/config/jetty.xml
index 72655392a8bd..58c5b2751216 100644
--- a/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-run-mojo-jar-scan-it/MyWebApp/src/config/jetty.xml
+++ b/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-run-mojo-jar-scan-it/MyWebApp/src/config/jetty.xml
@@ -25,7 +25,7 @@
-
+
diff --git a/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-start-distro-mojo-it/jetty-simple-webapp/src/base/etc/test-jetty-ee9.xml b/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-start-distro-mojo-it/jetty-simple-webapp/src/base/etc/test-jetty-ee9.xml
index 07a874e46f09..9857cb546ef7 100644
--- a/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-start-distro-mojo-it/jetty-simple-webapp/src/base/etc/test-jetty-ee9.xml
+++ b/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-start-distro-mojo-it/jetty-simple-webapp/src/base/etc/test-jetty-ee9.xml
@@ -5,7 +5,7 @@
[
-
+
diff --git a/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-start-forked-mojo-it/jetty-simple-webapp/src/config/jetty.xml b/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-start-forked-mojo-it/jetty-simple-webapp/src/config/jetty.xml
index b2e4ff6a33ef..343f5e7f99b1 100644
--- a/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-start-forked-mojo-it/jetty-simple-webapp/src/config/jetty.xml
+++ b/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-start-forked-mojo-it/jetty-simple-webapp/src/config/jetty.xml
@@ -26,7 +26,7 @@
-
+
diff --git a/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-start-gwt-it/beer-server/src/config/jetty.xml b/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-start-gwt-it/beer-server/src/config/jetty.xml
index b2e4ff6a33ef..343f5e7f99b1 100644
--- a/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-start-gwt-it/beer-server/src/config/jetty.xml
+++ b/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-start-gwt-it/beer-server/src/config/jetty.xml
@@ -26,7 +26,7 @@
-
+
diff --git a/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/pom.xml b/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/pom.xml
index aadb236bb245..e5779619b9df 100644
--- a/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/pom.xml
+++ b/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/pom.xml
@@ -112,7 +112,7 @@
-
+
${basedir}/src/config/login.xml
diff --git a/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/config/jetty.xml b/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/config/jetty.xml
index b2e4ff6a33ef..343f5e7f99b1 100644
--- a/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/config/jetty.xml
+++ b/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/config/jetty.xml
@@ -26,7 +26,7 @@
-
+
diff --git a/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-start-mojo-multi-module-single-war-it/webapp-war/src/config/jetty.xml b/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-start-mojo-multi-module-single-war-it/webapp-war/src/config/jetty.xml
index b2e4ff6a33ef..343f5e7f99b1 100644
--- a/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-start-mojo-multi-module-single-war-it/webapp-war/src/config/jetty.xml
+++ b/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-start-mojo-multi-module-single-war-it/webapp-war/src/config/jetty.xml
@@ -26,7 +26,7 @@
-
+
diff --git a/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-start-overlay-it/jetty-simple-webapp/src/config/jetty.xml b/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-start-overlay-it/jetty-simple-webapp/src/config/jetty.xml
index b2e4ff6a33ef..343f5e7f99b1 100644
--- a/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-start-overlay-it/jetty-simple-webapp/src/config/jetty.xml
+++ b/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-start-overlay-it/jetty-simple-webapp/src/config/jetty.xml
@@ -26,7 +26,7 @@
-
+
diff --git a/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-start-war-distro-mojo-it/jetty-simple-webapp/src/base/etc/test-jetty-ee9.xml b/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-start-war-distro-mojo-it/jetty-simple-webapp/src/base/etc/test-jetty-ee9.xml
index 07a874e46f09..9857cb546ef7 100644
--- a/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-start-war-distro-mojo-it/jetty-simple-webapp/src/base/etc/test-jetty-ee9.xml
+++ b/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-start-war-distro-mojo-it/jetty-simple-webapp/src/base/etc/test-jetty-ee9.xml
@@ -5,7 +5,7 @@
][
-
+
diff --git a/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-start-war-forked-mojo-it/jetty-simple-webapp/src/config/jetty.xml b/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-start-war-forked-mojo-it/jetty-simple-webapp/src/config/jetty.xml
index b2e4ff6a33ef..343f5e7f99b1 100644
--- a/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-start-war-forked-mojo-it/jetty-simple-webapp/src/config/jetty.xml
+++ b/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-start-war-forked-mojo-it/jetty-simple-webapp/src/config/jetty.xml
@@ -26,7 +26,7 @@
-
+
diff --git a/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-start-war-mojo-it/src/config/jetty.xml b/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-start-war-mojo-it/src/config/jetty.xml
index b2e4ff6a33ef..343f5e7f99b1 100644
--- a/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-start-war-mojo-it/src/config/jetty.xml
+++ b/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-start-war-mojo-it/src/config/jetty.xml
@@ -26,7 +26,7 @@
-
+
diff --git a/jetty-ee9/jetty-ee9-maven-plugin/src/main/java/org/eclipse/jetty/ee9/maven/plugin/AbstractUnassembledWebAppMojo.java b/jetty-ee9/jetty-ee9-maven-plugin/src/main/java/org/eclipse/jetty/ee9/maven/plugin/AbstractUnassembledWebAppMojo.java
index 5185f62397e7..0b23a5a92656 100644
--- a/jetty-ee9/jetty-ee9-maven-plugin/src/main/java/org/eclipse/jetty/ee9/maven/plugin/AbstractUnassembledWebAppMojo.java
+++ b/jetty-ee9/jetty-ee9-maven-plugin/src/main/java/org/eclipse/jetty/ee9/maven/plugin/AbstractUnassembledWebAppMojo.java
@@ -23,6 +23,9 @@
import org.apache.maven.artifact.Artifact;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugins.annotations.Parameter;
+import org.eclipse.jetty.maven.MavenProjectHelper;
+import org.eclipse.jetty.maven.Overlay;
+import org.eclipse.jetty.maven.ScanPattern;
import org.eclipse.jetty.util.resource.Resource;
import org.eclipse.jetty.util.resource.ResourceFactory;
import org.eclipse.jetty.util.resource.Resources;
@@ -198,7 +201,7 @@ protected void configureUnassembledWebApp() throws Exception
//process any overlays and the war type artifacts, and
//sets up the base resource collection for the webapp
- mavenProjectHelper.getOverlayManager().applyOverlays(webApp);
+ mavenProjectHelper.getOverlayManager().applyOverlays(webApp.getCoreContextHandler(), webApp.getBaseAppFirst());
getLog().info("web.xml file = " + webApp.getDescriptor());
getLog().info("Webapp directory = " + webAppSourceDirectory.getCanonicalPath());
diff --git a/jetty-ee9/jetty-ee9-maven-plugin/src/main/java/org/eclipse/jetty/ee9/maven/plugin/AbstractWebAppMojo.java b/jetty-ee9/jetty-ee9-maven-plugin/src/main/java/org/eclipse/jetty/ee9/maven/plugin/AbstractWebAppMojo.java
index bd5ba9fc62d1..eac0c0ce8f7d 100644
--- a/jetty-ee9/jetty-ee9-maven-plugin/src/main/java/org/eclipse/jetty/ee9/maven/plugin/AbstractWebAppMojo.java
+++ b/jetty-ee9/jetty-ee9-maven-plugin/src/main/java/org/eclipse/jetty/ee9/maven/plugin/AbstractWebAppMojo.java
@@ -47,7 +47,10 @@
import org.apache.maven.project.MavenProject;
import org.codehaus.plexus.util.StringUtils;
import org.eclipse.aether.RepositorySystem;
-import org.eclipse.jetty.ee9.maven.plugin.utils.MavenProjectHelper;
+import org.eclipse.jetty.maven.MavenProjectHelper;
+import org.eclipse.jetty.maven.MavenServerConnector;
+import org.eclipse.jetty.maven.PluginLog;
+import org.eclipse.jetty.maven.ScanTargetPattern;
import org.eclipse.jetty.security.LoginService;
import org.eclipse.jetty.server.RequestLog;
import org.eclipse.jetty.server.Server;
@@ -562,7 +565,7 @@ protected JettyHomeForker newJettyHomeForker()
if (jettyHome == null)
jetty.setJettyHomeZip(jettyHomeZip != null ? jettyHomeZip : mavenProjectHelper.resolveArtifact(JETTY_HOME_GROUPID, JETTY_HOME_ARTIFACTID, plugin.getVersion(), "zip"));
- jetty.version = plugin.getVersion();
+ jetty.setVersion(plugin.getVersion());
jetty.setJettyHome(jettyHome);
jetty.setJettyBase(jettyBase);
jetty.setBaseDir(target);
diff --git a/jetty-ee9/jetty-ee9-maven-plugin/src/main/java/org/eclipse/jetty/ee9/maven/plugin/JettyEmbedder.java b/jetty-ee9/jetty-ee9-maven-plugin/src/main/java/org/eclipse/jetty/ee9/maven/plugin/JettyEmbedder.java
index c21aad90725e..5239ec1bb64f 100644
--- a/jetty-ee9/jetty-ee9-maven-plugin/src/main/java/org/eclipse/jetty/ee9/maven/plugin/JettyEmbedder.java
+++ b/jetty-ee9/jetty-ee9-maven-plugin/src/main/java/org/eclipse/jetty/ee9/maven/plugin/JettyEmbedder.java
@@ -24,6 +24,10 @@
import org.eclipse.jetty.ee9.quickstart.QuickStartConfiguration;
import org.eclipse.jetty.ee9.quickstart.QuickStartConfiguration.Mode;
import org.eclipse.jetty.ee9.servlet.ServletHandler;
+import org.eclipse.jetty.ee9.webapp.Configurations;
+import org.eclipse.jetty.maven.AbstractJettyEmbedder;
+import org.eclipse.jetty.maven.MavenServerConnector;
+import org.eclipse.jetty.maven.ServerSupport;
import org.eclipse.jetty.security.LoginService;
import org.eclipse.jetty.server.RequestLog;
import org.eclipse.jetty.server.Server;
@@ -32,201 +36,21 @@
import org.eclipse.jetty.util.component.ContainerLifeCycle;
/**
- * JettyEmbedded
- *
+ * JettyEmbedder
* Starts jetty within the current process.
*/
-public class JettyEmbedder extends ContainerLifeCycle
+public class JettyEmbedder extends AbstractJettyEmbedder
{
- protected List contextHandlers;
- protected List loginServices;
- protected RequestLog requestLog;
- protected MavenServerConnector httpConnector;
- protected Server server;
- protected MavenWebAppContext webApp;
- protected boolean exitVm;
- protected boolean stopAtShutdown;
- protected List jettyXmlFiles;
- protected Map jettyProperties;
- protected ShutdownMonitor shutdownMonitor;
- protected int stopPort;
- protected String stopKey;
- private String contextXml;
- private Properties webAppProperties;
+ private MavenWebAppContext webApp;
- public List getContextHandlers()
- {
- return contextHandlers;
- }
-
- public void setContextHandlers(List contextHandlers)
- {
- if (contextHandlers == null)
- this.contextHandlers = null;
- else
- this.contextHandlers = new ArrayList<>(contextHandlers);
- }
-
- public List getLoginServices()
- {
- return loginServices;
- }
-
- public void setLoginServices(List loginServices)
- {
- if (loginServices == null)
- this.loginServices = null;
- else
- this.loginServices = new ArrayList<>(loginServices);
- }
-
- public RequestLog getRequestLog()
- {
- return requestLog;
- }
-
- public void setRequestLog(RequestLog requestLog)
- {
- this.requestLog = requestLog;
- }
-
- public MavenServerConnector getHttpConnector()
- {
- return httpConnector;
- }
-
- public void setHttpConnector(MavenServerConnector httpConnector)
- {
- this.httpConnector = httpConnector;
- }
-
- public Server getServer()
- {
- return server;
- }
-
- public void setServer(Server server)
- {
- this.server = server;
- }
-
- public MavenWebAppContext getWebApp()
- {
- return webApp;
- }
-
- public boolean isExitVm()
- {
- return exitVm;
- }
-
- public void setExitVm(boolean exitVm)
- {
- this.exitVm = exitVm;
- }
-
- public boolean isStopAtShutdown()
- {
- return stopAtShutdown;
- }
-
- public void setStopAtShutdown(boolean stopAtShutdown)
- {
- this.stopAtShutdown = stopAtShutdown;
- }
-
- public List getJettyXmlFiles()
- {
- return jettyXmlFiles;
- }
-
- public void setJettyXmlFiles(List jettyXmlFiles)
- {
- this.jettyXmlFiles = jettyXmlFiles;
- }
-
- public Map getJettyProperties()
- {
- return jettyProperties;
- }
-
- public void setJettyProperties(Map jettyProperties)
- {
- this.jettyProperties = jettyProperties;
- }
-
- public ShutdownMonitor getShutdownMonitor()
- {
- return shutdownMonitor;
- }
-
- public void setShutdownMonitor(ShutdownMonitor shutdownMonitor)
- {
- this.shutdownMonitor = shutdownMonitor;
- }
-
- public int getStopPort()
- {
- return stopPort;
- }
-
- public void setStopPort(int stopPort)
- {
- this.stopPort = stopPort;
- }
-
- public String getStopKey()
- {
- return stopKey;
- }
-
- public void setStopKey(String stopKey)
- {
- this.stopKey = stopKey;
- }
-
- public void setWebApp(MavenWebAppContext app) throws Exception
+ public void setWebApp(MavenWebAppContext app)
{
webApp = app;
}
-
- public void setWebAppProperties(Properties props)
- {
- if (webAppProperties != null)
- webAppProperties.clear();
-
- if (props != null)
- {
- if (webAppProperties == null)
- webAppProperties = new Properties();
-
- webAppProperties.putAll(props);
- }
- }
-
- public String getContextXml()
- {
- return contextXml;
- }
- public void setContextXml(String contextXml)
+ public void redeployWebApp() throws Exception
{
- this.contextXml = contextXml;
- }
-
- public void doStart() throws Exception
- {
- super.doStart();
-
- configure();
- configureShutdownMonitor();
- server.start();
- }
-
- protected void redeployWebApp() throws Exception
- {
- if (!webApp.isStopped())
- webApp.stop();
+ stopWebApp();
//clear the ServletHandler, which may have
//remembered "durable" Servlets, Filters, Listeners
@@ -239,40 +63,22 @@ protected void redeployWebApp() throws Exception
webApp.start();
}
-
- protected void join() throws InterruptedException
+
+ @Override
+ public void stopWebApp() throws Exception
{
- server.join();
+ if (webApp != null && !webApp.isStopped())
+ webApp.stop();
}
/**
- * Configure the server and the webapp
+ * Configure the webapp
* @throws Exception if there is an unspecified problem
*/
- private void configure() throws Exception
+ public void configureWebApp() throws Exception
{
- //apply any configs from jetty.xml files first
- Server tmp = ServerSupport.applyXmlConfigurations(new Server(), jettyXmlFiles, jettyProperties);
-
- if (tmp != null)
- server = tmp;
-
- server.setStopAtShutdown(stopAtShutdown);
-
- //ensure there's a connector
- if (httpConnector != null)
- httpConnector.setServer(server);
-
- ServerSupport.configureConnectors(server, httpConnector, jettyProperties);
-
- //set up handler structure
- ServerSupport.configureHandlers(server, contextHandlers, requestLog);
-
//Set up list of default Configurations to apply to a webapp
- ServerSupport.configureDefaultConfigurationClasses(server);
-
- // set up security realms
- ServerSupport.configureLoginServices(server, loginServices);
+ Configurations.setServerDefault(server);
/* Configure the webapp */
if (webApp == null)
@@ -291,32 +97,17 @@ private void configure() throws Exception
webApp.setAttribute(QuickStartConfiguration.MODE, Mode.QUICKSTART);
}
}
-
- //add the webapp to the server
- ServerSupport.addWebApplication(server, webApp);
}
- private void applyWebAppProperties() throws Exception
+ public void applyWebAppProperties() throws Exception
{
- //apply properties to the webapp if there are any
- if (contextXml != null)
- {
- if (webAppProperties == null)
- webAppProperties = new Properties();
-
- webAppProperties.put("context.xml", contextXml);
- }
+ super.applyWebAppProperties();
WebAppPropertyConverter.fromProperties(webApp, webAppProperties, server, jettyProperties);
}
-
- private void configureShutdownMonitor()
+
+ public void addWebAppToServer() throws Exception
{
- if (stopPort > 0 && stopKey != null)
- {
- ShutdownMonitor monitor = ShutdownMonitor.getInstance();
- monitor.setPort(stopPort);
- monitor.setKey(stopKey);
- monitor.setExitVm(exitVm);
- }
+ //add the webapp to the server
+ ServerSupport.addWebApplication(server, webApp.getCoreContextHandler());
}
}
diff --git a/jetty-ee9/jetty-ee9-maven-plugin/src/main/java/org/eclipse/jetty/ee9/maven/plugin/JettyForkedChild.java b/jetty-ee9/jetty-ee9-maven-plugin/src/main/java/org/eclipse/jetty/ee9/maven/plugin/JettyForkedChild.java
index ca454c304ca4..ad6a54d83dc5 100644
--- a/jetty-ee9/jetty-ee9-maven-plugin/src/main/java/org/eclipse/jetty/ee9/maven/plugin/JettyForkedChild.java
+++ b/jetty-ee9/jetty-ee9-maven-plugin/src/main/java/org/eclipse/jetty/ee9/maven/plugin/JettyForkedChild.java
@@ -13,23 +13,8 @@
package org.eclipse.jetty.ee9.maven.plugin;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Properties;
-import java.util.Set;
-
-import org.eclipse.jetty.util.Scanner;
-import org.eclipse.jetty.util.StringUtil;
-import org.eclipse.jetty.util.component.ContainerLifeCycle;
+import org.eclipse.jetty.maven.AbstractForkedChild;
+import org.eclipse.jetty.maven.AbstractJettyEmbedder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -39,15 +24,9 @@
* This is the class that is executed when the jetty maven plugin
* forks a process when DeploymentMode=FORKED.
*/
-public class JettyForkedChild extends ContainerLifeCycle
+public class JettyForkedChild extends AbstractForkedChild
{
private static final Logger LOG = LoggerFactory.getLogger(JettyForkedChild.class);
-
- protected JettyEmbedder jetty;
- protected File tokenFile; // TODO: convert to Path
- protected Scanner scanner;
- protected File webAppPropsFile; // TODO: convert to Path
- protected int scanInterval;
/**
* @param args arguments that were passed to main
@@ -56,158 +35,13 @@ public class JettyForkedChild extends ContainerLifeCycle
public JettyForkedChild(String[] args)
throws Exception
{
- jetty = new JettyEmbedder();
- configure(args);
- }
-
- /**
- * Based on the args passed to the program, configure jetty.
- *
- * @param args args that were passed to the program.
- * @throws Exception if unable to load webprops
- */
- public void configure(String[] args)
- throws Exception
- {
- Map jettyProperties = new HashMap<>();
-
- for (int i = 0; i < args.length; i++)
- {
- //--stop-port
- if ("--stop-port".equals(args[i]))
- {
- jetty.setStopPort(Integer.parseInt(args[++i]));
- continue;
- }
-
- //--stop-key
- if ("--stop-key".equals(args[i]))
- {
- jetty.setStopKey(args[++i]);
- continue;
- }
-
- //--jettyXml
- if ("--jetty-xml".equals(args[i]))
- {
- List jettyXmls = new ArrayList<>();
- String[] names = StringUtil.csvSplit(args[++i]);
- for (int j = 0; names != null && j < names.length; j++)
- {
- jettyXmls.add(new File(names[j].trim()));
- }
- jetty.setJettyXmlFiles(jettyXmls);
- continue;
- }
- //--webprops
- if ("--webprops".equals(args[i]))
- {
- webAppPropsFile = new File(args[++i].trim());
- jetty.setWebAppProperties(loadWebAppProps());
- continue;
- }
-
- //--token
- if ("--token".equals(args[i]))
- {
- tokenFile = new File(args[++i].trim());
- continue;
- }
-
- if ("--scanInterval".equals(args[i]))
- {
- scanInterval = Integer.parseInt(args[++i].trim());
- scanner = new Scanner();
- scanner.setReportExistingFilesOnStartup(false);
- scanner.setScanInterval(scanInterval);
- scanner.addListener(new Scanner.BulkListener()
- {
- public void filesChanged(Set changes)
- {
- if (!Objects.isNull(scanner))
- {
- try
- {
- scanner.stop();
- if (!Objects.isNull(jetty.getWebApp()))
- {
- //stop the webapp
- jetty.getWebApp().stop();
- //reload the props
- jetty.setWebAppProperties(loadWebAppProps());
- jetty.setWebApp(jetty.getWebApp());
- //restart the webapp
- jetty.redeployWebApp();
-
- //restart the scanner
- scanner.start();
- }
- }
- catch (Exception e)
- {
- LOG.error("Error reconfiguring/restarting webapp after change in watched files", e);
- }
- }
- }
- });
-
- if (!Objects.isNull(webAppPropsFile))
- scanner.addFile(webAppPropsFile.toPath());
- continue;
- }
-
- //assume everything else is a jetty property to be passed in
- String[] tmp = args[i].trim().split("=");
- if (tmp.length == 2)
- {
- jettyProperties.put(tmp[0], tmp[1]);
- }
- }
-
- jetty.setJettyProperties(jettyProperties);
- jetty.setExitVm(true);
- }
-
- /**
- * Load properties from a file describing the webapp if one is
- * present.
- *
- * @return file contents as properties
- * @throws FileNotFoundException if there is a file not found problem
- * @throws IOException if there is an IO problem
- */
- private Properties loadWebAppProps() throws FileNotFoundException, IOException
- {
- Properties props = new Properties();
- if (Objects.nonNull(webAppPropsFile))
- props.load(new FileInputStream(webAppPropsFile));
- return props;
+ super(args);
}
- /**
- * Start a jetty instance and webapp. This thread will
- * wait until jetty exits.
- */
- public void doStart()
- throws Exception
+ @Override
+ protected AbstractJettyEmbedder newJettyEmbedder()
{
- super.doStart();
-
- //Start the embedded jetty instance
- jetty.start();
-
- //touch file to signify start of jetty
- Path tokenPath = tokenFile.toPath();
- Files.createFile(tokenPath);
-
- //Start a watcher on a file that will change if the
- //webapp is regenerated; stop the webapp, apply the
- //properties and restart it.
- if (scanner != null)
- scanner.start();
-
- //wait for jetty to finish
- jetty.join();
+ return new JettyEmbedder();
}
public static void main(String[] args)
diff --git a/jetty-ee9/jetty-ee9-maven-plugin/src/main/java/org/eclipse/jetty/ee9/maven/plugin/JettyForker.java b/jetty-ee9/jetty-ee9-maven-plugin/src/main/java/org/eclipse/jetty/ee9/maven/plugin/JettyForker.java
index 4231274bfb35..8c742ec1eb8e 100644
--- a/jetty-ee9/jetty-ee9-maven-plugin/src/main/java/org/eclipse/jetty/ee9/maven/plugin/JettyForker.java
+++ b/jetty-ee9/jetty-ee9-maven-plugin/src/main/java/org/eclipse/jetty/ee9/maven/plugin/JettyForker.java
@@ -18,108 +18,34 @@
import java.util.List;
import java.util.Map;
+import org.eclipse.jetty.maven.AbstractForker;
+import org.eclipse.jetty.maven.AbstractServerForker;
+import org.eclipse.jetty.maven.PluginLog;
import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.util.Jetty;
/**
* JettyForker
*
* Uses quickstart to generate a webapp and forks a process to run it.
*/
-public class JettyForker extends AbstractForker
+public class JettyForker extends AbstractServerForker
{
- protected File forkWebXml;
- protected Server server;
protected MavenWebAppContext webApp;
- protected String containerClassPath;
- protected File webAppPropsFile;
- protected String contextXml;
- protected int scanInterval;
QuickStartGenerator generator;
- /**
- * @return the scan
- */
- public boolean isScan()
+ public JettyForker()
{
- return scanInterval > 0;
+ executionClassName = JettyForkedChild.class.getCanonicalName();
}
- /**
- * Set if true, the forked child will scan for changes at 1 second intervals.
- * @param scan if true, the forked child will scan for changes at 1 second intervals
- */
- public void setScan(boolean scan)
+ public void setWebApp(MavenWebAppContext webApp)
{
- setScanInterval(scan ? 1 : 0);
- }
-
- public int getScanInterval()
- {
- return scanInterval;
- }
-
- public void setScanInterval(int sec)
- {
- scanInterval = sec;
- }
-
- public File getWebAppPropsFile()
- {
- return webAppPropsFile;
- }
-
- public void setWebAppPropsFile(File webAppPropsFile)
- {
- this.webAppPropsFile = webAppPropsFile;
- }
-
- public File getForkWebXml()
- {
- return forkWebXml;
- }
-
- public void setForkWebXml(File forkWebXml)
- {
- this.forkWebXml = forkWebXml;
- }
-
- public String getContextXml()
- {
- return contextXml;
- }
-
- public void setContextXml(String contextXml)
- {
- this.contextXml = contextXml;
- }
-
- public String getContainerClassPath()
- {
- return containerClassPath;
- }
-
- public void setContainerClassPath(String containerClassPath)
- {
- this.containerClassPath = containerClassPath;
- }
-
- public void setWebApp(MavenWebAppContext app)
- {
- webApp = app;
- }
-
- public Server getServer()
- {
- return server;
- }
-
- public void setServer(Server server)
- {
- this.server = server;
+ this.webApp = webApp;
}
@Override
- public void doStart()
+ public void generateWebApp()
throws Exception
{
//Run the webapp to create the quickstart file and properties file
@@ -128,8 +54,6 @@ public void doStart()
generator.setWebAppPropsFile(webAppPropsFile.toPath());
generator.setServer(server);
generator.generate();
-
- super.doStart();
}
protected void redeployWebApp()
@@ -139,154 +63,4 @@ protected void redeployWebApp()
//which will redeploy the webapp
generator.generate();
}
-
- public ProcessBuilder createCommand()
- {
- List cmd = new ArrayList();
- cmd.add(getJavaBin());
-
- if (jvmArgs != null)
- {
- String[] args = jvmArgs.split(" ");
- for (int i = 0; args != null && i < args.length; i++)
- {
- if (args[i] != null && !"".equals(args[i]))
- cmd.add(args[i].trim());
- }
- }
-
- if (systemProperties != null)
- {
- for (Map.Entry e:systemProperties.entrySet())
- {
- cmd.add("-D" + e.getKey() + "=" + e.getValue());
- }
- }
-
- if (containerClassPath != null && containerClassPath.length() > 0)
- {
- cmd.add("-cp");
- cmd.add(containerClassPath);
- }
-
- cmd.add(JettyForkedChild.class.getCanonicalName());
-
- if (stopPort > 0 && stopKey != null)
- {
- cmd.add("--stop-port");
- cmd.add(Integer.toString(stopPort));
- cmd.add("--stop-key");
- cmd.add(stopKey);
- }
- if (jettyXmlFiles != null)
- {
- cmd.add("--jetty-xml");
- StringBuilder tmp = new StringBuilder();
- for (File jettyXml:jettyXmlFiles)
- {
- if (tmp.length() != 0)
- tmp.append(",");
- tmp.append(jettyXml.getAbsolutePath());
- }
- cmd.add(tmp.toString());
- }
-
- cmd.add("--webprops");
- cmd.add(webAppPropsFile.getAbsolutePath());
-
- cmd.add("--token");
- cmd.add(tokenFile.getAbsolutePath());
-
- if (scanInterval > 0)
- {
- cmd.add("--scanInterval");
- cmd.add(Integer.toString(scanInterval));
- }
-
- if (jettyProperties != null)
- {
- for (Map.Entry e:jettyProperties.entrySet())
- {
- cmd.add(e.getKey() + "=" + e.getValue());
- }
- }
-
- ProcessBuilder command = new ProcessBuilder(cmd);
- command.directory(workDir);
-
- if (PluginLog.getLog().isDebugEnabled())
- PluginLog.getLog().debug("Forked cli:" + command.command());
-
- PluginLog.getLog().info("Forked process starting");
-
- //set up extra environment vars if there are any
- if (env != null && !env.isEmpty())
- command.environment().putAll(env);
-
- if (waitForChild)
- {
- command.inheritIO();
- }
- else
- {
- command.redirectOutput(jettyOutputFile);
- command.redirectErrorStream(true);
- }
- return command;
- }
-
- /**
- * Get the location of the java binary.
- * @return the location of the java binary
- */
- private String getJavaBin()
- {
- String[] javaexes = new String[]{"java", "java.exe"};
-
- File javaHomeDir = new File(System.getProperty("java.home"));
- for (String javaexe : javaexes)
- {
- File javabin = new File(javaHomeDir, fileSeparators("bin/" + javaexe));
- if (javabin.exists() && javabin.isFile())
- {
- return javabin.getAbsolutePath();
- }
- }
-
- return "java";
- }
-
- public static String fileSeparators(String path)
- {
- StringBuilder ret = new StringBuilder();
- for (char c : path.toCharArray())
- {
- if ((c == '/') || (c == '\\'))
- {
- ret.append(File.separatorChar);
- }
- else
- {
- ret.append(c);
- }
- }
- return ret.toString();
- }
-
- public static String pathSeparators(String path)
- {
- StringBuilder ret = new StringBuilder();
- for (char c : path.toCharArray())
- {
- if ((c == ',') || (c == ':'))
- {
- ret.append(File.pathSeparatorChar);
- }
- else
- {
- ret.append(c);
- }
- }
- return ret.toString();
- }
}
diff --git a/jetty-ee9/jetty-ee9-maven-plugin/src/main/java/org/eclipse/jetty/ee9/maven/plugin/JettyHomeForker.java b/jetty-ee9/jetty-ee9-maven-plugin/src/main/java/org/eclipse/jetty/ee9/maven/plugin/JettyHomeForker.java
index c92f7be42922..d97acace38d8 100644
--- a/jetty-ee9/jetty-ee9-maven-plugin/src/main/java/org/eclipse/jetty/ee9/maven/plugin/JettyHomeForker.java
+++ b/jetty-ee9/jetty-ee9-maven-plugin/src/main/java/org/eclipse/jetty/ee9/maven/plugin/JettyHomeForker.java
@@ -13,153 +13,21 @@
package org.eclipse.jetty.ee9.maven.plugin;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URI;
-import java.nio.file.FileAlreadyExistsException;
-import java.nio.file.FileSystems;
-import java.nio.file.FileVisitOption;
-import java.nio.file.FileVisitResult;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.SimpleFileVisitor;
-import java.nio.file.attribute.BasicFileAttributes;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.EnumSet;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.jetty.util.IO;
-import org.eclipse.jetty.util.StringUtil;
-import org.eclipse.jetty.util.TypeUtil;
-import org.eclipse.jetty.util.resource.Resource;
-import org.eclipse.jetty.util.resource.ResourceFactory;
+import org.eclipse.jetty.maven.AbstractHomeForker;
/**
- * JettyHomeBaseForker
+ * JettyHomeForker
*
* Unpacks a jetty-home and configures it with a base that allows it
* to run an unassembled webapp.
*/
-public class JettyHomeForker extends AbstractForker
+public class JettyHomeForker extends AbstractHomeForker
{
protected MavenWebAppContext webApp;
- protected String contextXml;
-
- /**
- * Location of existing jetty home directory
- */
- protected File jettyHome;
-
- /**
- * Zip of jetty-home
- */
- protected File jettyHomeZip;
-
- /**
- * Location of existing jetty base directory
- */
- protected File jettyBase;
-
- protected File baseDir;
-
- /**
- * Optional list of other modules to
- * activate.
- */
- protected String[] modules;
-
- /*
- * Optional jetty commands
- */
- protected String jettyOptions;
-
- protected List libExtJarFiles;
- protected Path modulesPath;
- protected Path etcPath;
- protected Path libPath;
- protected Path webappPath;
- protected Path mavenLibPath;
- protected String version;
-
- public void setJettyOptions(String jettyOptions)
- {
- this.jettyOptions = jettyOptions;
- }
-
- public String getJettyOptions()
- {
- return jettyOptions;
- }
-
- public List getLibExtJarFiles()
- {
- return libExtJarFiles;
- }
-
- public void setLibExtJarFiles(List libExtJarFiles)
- {
- this.libExtJarFiles = libExtJarFiles;
- }
-
- public File getJettyHome()
- {
- return jettyHome;
- }
-
- public void setJettyHome(File jettyHome)
- {
- this.jettyHome = jettyHome;
- }
-
- public File getJettyBase()
- {
- return jettyBase;
- }
-
- public void setJettyBase(File jettyBase)
- {
- this.jettyBase = jettyBase;
- }
-
- public String[] getModules()
- {
- return modules;
- }
-
- public void setModules(String[] modules)
- {
- this.modules = modules;
- }
-
- public String getContextXmlFile()
+ public JettyHomeForker()
{
- return contextXml;
- }
-
- public void setContextXml(String contextXml)
- {
- this.contextXml = contextXml;
- }
-
- public File getJettyHomeZip()
- {
- return jettyHomeZip;
- }
-
- public void setJettyHomeZip(File jettyHomeZip)
- {
- this.jettyHomeZip = jettyHomeZip;
- }
-
- public MavenWebAppContext getWebApp()
- {
- return webApp;
+ environment = "ee9";
}
public void setWebApp(MavenWebAppContext webApp)
@@ -167,116 +35,6 @@ public void setWebApp(MavenWebAppContext webApp)
this.webApp = webApp;
}
- public File getBaseDir()
- {
- return baseDir;
- }
-
- public void setBaseDir(File baseDir)
- {
- this.baseDir = baseDir;
- }
-
- @Override
- protected ProcessBuilder createCommand()
- {
- List cmd = new ArrayList<>();
- cmd.add("java");
-
- //add any args to the jvm
- if (StringUtil.isNotBlank(jvmArgs))
- {
- Arrays.stream(jvmArgs.split(" ")).filter(a -> StringUtil.isNotBlank(a)).forEach((a) -> cmd.add(a.trim()));
- }
-
- cmd.add("-jar");
- cmd.add(new File(jettyHome, "start.jar").getAbsolutePath());
-
- if (systemProperties != null)
- {
- for (Map.Entry e : systemProperties.entrySet())
- {
- cmd.add("-D" + e.getKey() + "=" + e.getValue());
- }
- }
-
- cmd.add("-DSTOP.PORT=" + stopPort);
- if (stopKey != null)
- cmd.add("-DSTOP.KEY=" + stopKey);
-
- //set up enabled jetty modules
- StringBuilder tmp = new StringBuilder();
- tmp.append("--module=");
- tmp.append("server,http,ee9-webapp,ee9-deploy");
- if (modules != null)
- {
- for (String m : modules)
- {
- if (tmp.indexOf(m) < 0)
- tmp.append("," + m);
- }
- }
-
- if (libExtJarFiles != null && !libExtJarFiles.isEmpty() && tmp.indexOf("ext") < 0)
- tmp.append(",ext");
- tmp.append(",ee9-maven");
- cmd.add(tmp.toString());
-
- //put any other jetty options onto the command line
- if (StringUtil.isNotBlank(jettyOptions))
- {
- Arrays.stream(jettyOptions.split(" ")).filter(a -> StringUtil.isNotBlank(a)).forEach((a) -> cmd.add(a.trim()));
- }
-
- //put any jetty properties onto the command line
- if (jettyProperties != null)
- {
- for (Map.Entry e : jettyProperties.entrySet())
- {
- cmd.add(e.getKey() + "=" + e.getValue());
- }
- }
-
- //existence of this file signals process started
- cmd.add("jetty.token.file=" + tokenFile.getAbsolutePath().toString());
-
- ProcessBuilder builder = new ProcessBuilder(cmd);
- builder.directory(workDir);
-
- PluginLog.getLog().info("Home process starting");
-
- //set up extra environment vars if there are any
- if (!env.isEmpty())
- builder.environment().putAll(env);
-
- if (waitForChild)
- builder.inheritIO();
- else
- {
- builder.redirectOutput(jettyOutputFile);
- builder.redirectErrorStream(true);
- }
- return builder;
- }
-
- @Override
- public void doStart() throws Exception
- {
- //set up a jetty-home
- configureJettyHome();
-
- if (jettyHome == null || !jettyHome.exists())
- throw new IllegalStateException("No jetty home");
-
- //set up a jetty-base
- configureJettyBase();
-
- //convert the webapp to properties
- generateWebAppPropertiesFile();
-
- super.doStart();
- }
-
protected void redeployWebApp()
throws Exception
{
@@ -284,142 +42,9 @@ protected void redeployWebApp()
webappPath.resolve("maven.xml").toFile().setLastModified(System.currentTimeMillis());
}
- private void generateWebAppPropertiesFile()
+ protected void generateWebAppPropertiesFile()
throws Exception
{
WebAppPropertyConverter.toProperties(webApp, etcPath.resolve("maven.props").toFile(), contextXml);
}
-
- /**
- * Create or configure a jetty base.
- */
- private void configureJettyBase() throws Exception
- {
- if (jettyBase != null && !jettyBase.exists())
- throw new IllegalStateException(jettyBase.getAbsolutePath() + " does not exist");
-
- File targetJettyBase = new File(baseDir, "jetty-base");
- Path targetBasePath = targetJettyBase.toPath();
- if (Files.exists(targetBasePath))
- IO.delete(targetJettyBase);
-
- targetJettyBase.mkdirs();
-
- //jetty-base will be the working directory for the forked command
- workDir = targetJettyBase;
-
- //if there is an existing jetty base, copy parts of it
- if (jettyBase != null)
- {
- Path jettyBasePath = jettyBase.toPath();
-
- final File contextXmlFile = (contextXml == null ? null : FileSystems.getDefault().getPath(contextXml).toFile());
-
- //copy the existing jetty base
- Files.walkFileTree(jettyBasePath, EnumSet.of(FileVisitOption.FOLLOW_LINKS), Integer.MAX_VALUE,
- new SimpleFileVisitor()
- {
- @Override
- public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException
- {
- Path targetDir = targetBasePath.resolve(jettyBasePath.relativize(dir));
- try
- {
- Files.copy(dir, targetDir);
- }
- catch (FileAlreadyExistsException e)
- {
- if (!Files.isDirectory(targetDir)) //ignore attempt to recreate dir
- throw e;
- }
- return FileVisitResult.CONTINUE;
- }
-
- @Override
- public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException
- {
- if (contextXmlFile != null && Files.isSameFile(contextXmlFile.toPath(), file))
- return FileVisitResult.CONTINUE; //skip copying the context xml file
- Files.copy(file, targetBasePath.resolve(jettyBasePath.relativize(file)));
- return FileVisitResult.CONTINUE;
- }
- });
- }
-
- //make the jetty base structure
- modulesPath = Files.createDirectories(targetBasePath.resolve("modules"));
- etcPath = Files.createDirectories(targetBasePath.resolve("etc"));
- libPath = Files.createDirectories(targetBasePath.resolve("lib"));
- webappPath = Files.createDirectories(targetBasePath.resolve("webapps"));
- mavenLibPath = Files.createDirectories(libPath.resolve("maven-ee9"));
-
- //copy in the jetty-maven-plugin jar
- URI thisJar = TypeUtil.getLocationOfClass(this.getClass());
- if (thisJar == null)
- throw new IllegalStateException("Can't find jar for jetty-ee9-maven-plugin");
-
- try (InputStream jarStream = thisJar.toURL().openStream();
- FileOutputStream fileStream = new FileOutputStream(mavenLibPath.resolve("plugin.jar").toFile()))
- {
- IO.copy(jarStream, fileStream);
- }
-
- //copy in the maven.xml webapp file
- try (InputStream mavenXmlStream = getClass().getClassLoader().getResourceAsStream("maven-ee9.xml");
- FileOutputStream fileStream = new FileOutputStream(webappPath.resolve("maven-ee9.xml").toFile()))
- {
- IO.copy(mavenXmlStream, fileStream);
- }
-
- Files.writeString(webappPath.resolve("maven-ee9.properties"), "environment=ee9");
-
- //copy in the maven.mod file
- try (InputStream mavenModStream = getClass().getClassLoader().getResourceAsStream("ee9-maven.mod");
- FileOutputStream fileStream = new FileOutputStream(modulesPath.resolve("ee9-maven.mod").toFile()))
- {
- IO.copy(mavenModStream, fileStream);
- }
-
- //copy in the jetty-maven.xml file
- try (InputStream jettyMavenStream = getClass().getClassLoader().getResourceAsStream("jetty-ee9-maven.xml");
- FileOutputStream fileStream = new FileOutputStream(etcPath.resolve("jetty-ee9-maven.xml").toFile()))
- {
- IO.copy(jettyMavenStream, fileStream);
- }
-
- //if there were plugin dependencies, copy them into lib/ext
- if (libExtJarFiles != null && !libExtJarFiles.isEmpty())
- {
- Path libExtPath = Files.createDirectories(libPath.resolve("ext"));
- for (File f : libExtJarFiles)
- {
- try (InputStream jarStream = new FileInputStream(f);
- FileOutputStream fileStream = new FileOutputStream(libExtPath.resolve(f.getName()).toFile()))
- {
- IO.copy(jarStream, fileStream);
- }
- }
- }
- }
-
- private void configureJettyHome()
- throws Exception
- {
- if (jettyHome == null && jettyHomeZip == null)
- throw new IllegalStateException("No jettyHome");
-
- if (baseDir == null)
- throw new IllegalStateException("No baseDir");
-
- if (jettyHome == null)
- {
- try (ResourceFactory.Closeable resourceFactory = ResourceFactory.closeable())
- {
- Resource res = resourceFactory.newJarFileResource(jettyHomeZip.toPath().toUri());
- res.copyTo(baseDir.toPath());
- }
- //zip will unpack to target/jetty-home-
- jettyHome = new File(baseDir, "jetty-home-" + version);
- }
- }
}
diff --git a/jetty-ee9/jetty-ee9-maven-plugin/src/main/java/org/eclipse/jetty/ee9/maven/plugin/JettyRunMojo.java b/jetty-ee9/jetty-ee9-maven-plugin/src/main/java/org/eclipse/jetty/ee9/maven/plugin/JettyRunMojo.java
index 3cfcba6891a4..be4dcc1201b7 100644
--- a/jetty-ee9/jetty-ee9-maven-plugin/src/main/java/org/eclipse/jetty/ee9/maven/plugin/JettyRunMojo.java
+++ b/jetty-ee9/jetty-ee9-maven-plugin/src/main/java/org/eclipse/jetty/ee9/maven/plugin/JettyRunMojo.java
@@ -28,6 +28,7 @@
import org.apache.maven.plugins.annotations.Parameter;
import org.apache.maven.plugins.annotations.ResolutionScope;
import org.eclipse.jetty.ee9.webapp.WebAppContext;
+import org.eclipse.jetty.maven.ConsoleReader;
import org.eclipse.jetty.util.IncludeExcludeSet;
import org.eclipse.jetty.util.Scanner;
import org.eclipse.jetty.util.component.LifeCycle;
@@ -356,7 +357,7 @@ public void restartWebApp(boolean reconfigure) throws Exception
}
}
- embedder.getWebApp().stop();
+ embedder.stopWebApp();
configureWebApp();
embedder.redeployWebApp();
if (scanner != null)
diff --git a/jetty-ee9/jetty-ee9-maven-plugin/src/main/java/org/eclipse/jetty/ee9/maven/plugin/JettyRunWarMojo.java b/jetty-ee9/jetty-ee9-maven-plugin/src/main/java/org/eclipse/jetty/ee9/maven/plugin/JettyRunWarMojo.java
index 11e2b201bf87..74df47acd190 100644
--- a/jetty-ee9/jetty-ee9-maven-plugin/src/main/java/org/eclipse/jetty/ee9/maven/plugin/JettyRunWarMojo.java
+++ b/jetty-ee9/jetty-ee9-maven-plugin/src/main/java/org/eclipse/jetty/ee9/maven/plugin/JettyRunWarMojo.java
@@ -25,6 +25,7 @@
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;
import org.apache.maven.plugins.annotations.ResolutionScope;
+import org.eclipse.jetty.maven.ConsoleReader;
import org.eclipse.jetty.util.Scanner;
import org.eclipse.jetty.util.StringUtil;
@@ -235,7 +236,7 @@ public void restartWebApp(boolean reconfigure) throws Exception
warArtifacts = null;
configureScanner();
}
- embedder.getWebApp().stop();
+ embedder.stopWebApp();
configureWebApp();
embedder.redeployWebApp();
scanner.start();
diff --git a/jetty-ee9/jetty-ee9-maven-plugin/src/main/java/org/eclipse/jetty/ee9/maven/plugin/MavenWebAppContext.java b/jetty-ee9/jetty-ee9-maven-plugin/src/main/java/org/eclipse/jetty/ee9/maven/plugin/MavenWebAppContext.java
index 0111a9457b15..15a032166160 100644
--- a/jetty-ee9/jetty-ee9-maven-plugin/src/main/java/org/eclipse/jetty/ee9/maven/plugin/MavenWebAppContext.java
+++ b/jetty-ee9/jetty-ee9-maven-plugin/src/main/java/org/eclipse/jetty/ee9/maven/plugin/MavenWebAppContext.java
@@ -37,6 +37,7 @@
import org.eclipse.jetty.ee9.webapp.Configurations;
import org.eclipse.jetty.ee9.webapp.MetaInfConfiguration;
import org.eclipse.jetty.ee9.webapp.WebAppContext;
+import org.eclipse.jetty.maven.Overlay;
import org.eclipse.jetty.util.FileID;
import org.eclipse.jetty.util.StringUtil;
import org.eclipse.jetty.util.URIUtil;
diff --git a/jetty-ee9/jetty-ee9-maven-plugin/src/main/java/org/eclipse/jetty/ee9/maven/plugin/QuickStartGenerator.java b/jetty-ee9/jetty-ee9-maven-plugin/src/main/java/org/eclipse/jetty/ee9/maven/plugin/QuickStartGenerator.java
index 9c0fceca0c94..4fd8cdfb3618 100644
--- a/jetty-ee9/jetty-ee9-maven-plugin/src/main/java/org/eclipse/jetty/ee9/maven/plugin/QuickStartGenerator.java
+++ b/jetty-ee9/jetty-ee9-maven-plugin/src/main/java/org/eclipse/jetty/ee9/maven/plugin/QuickStartGenerator.java
@@ -18,6 +18,8 @@
import org.eclipse.jetty.ee9.annotations.AnnotationConfiguration;
import org.eclipse.jetty.ee9.quickstart.QuickStartConfiguration;
import org.eclipse.jetty.ee9.quickstart.QuickStartConfiguration.Mode;
+import org.eclipse.jetty.ee9.webapp.Configurations;
+import org.eclipse.jetty.maven.ServerSupport;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.util.thread.QueuedThreadPool;
@@ -152,7 +154,7 @@ public void generate()
//ensure handler structure enabled
ServerSupport.configureHandlers(server, null, null);
- ServerSupport.configureDefaultConfigurationClasses(server);
+ Configurations.setServerDefault(server);
//if our server has a thread pool associated we can do annotation scanning multithreaded,
//otherwise scanning will be single threaded
@@ -160,7 +162,7 @@ public void generate()
tpool = server.getBean(QueuedThreadPool.class);
//add webapp to our fake server instance
- ServerSupport.addWebApplication(server, webApp);
+ ServerSupport.addWebApplication(server, webApp.getCoreContextHandler());
//leave everything unpacked for the forked process to use
webApp.setPersistTempDirectory(true);
diff --git a/jetty-ee9/jetty-ee9-maven-plugin/src/main/resources/ee9-maven.mod b/jetty-ee9/jetty-ee9-maven-plugin/src/main/resources/ee9-maven.mod
index b418b19c1d13..4eee3f1211f3 100644
--- a/jetty-ee9/jetty-ee9-maven-plugin/src/main/resources/ee9-maven.mod
+++ b/jetty-ee9/jetty-ee9-maven-plugin/src/main/resources/ee9-maven.mod
@@ -12,7 +12,7 @@ ee9-webapp
ee9-annotations
[lib]
-lib/maven-ee9/**.jar
+lib/ee9-maven/**.jar
[xml]
etc/jetty-ee9-maven.xml
diff --git a/jetty-ee9/jetty-ee9-maven-plugin/src/main/resources/jetty-ee9-maven.xml b/jetty-ee9/jetty-ee9-maven-plugin/src/main/resources/jetty-ee9-maven.xml
index 4b7f403ba4a2..b83be87a6474 100644
--- a/jetty-ee9/jetty-ee9-maven-plugin/src/main/resources/jetty-ee9-maven.xml
+++ b/jetty-ee9/jetty-ee9-maven-plugin/src/main/resources/jetty-ee9-maven.xml
@@ -4,7 +4,7 @@
-
+
diff --git a/jetty-ee9/jetty-ee9-maven-plugin/src/test/java/org/eclipse/jetty/ee9/maven/plugin/TestForkedChild.java b/jetty-ee9/jetty-ee9-maven-plugin/src/test/java/org/eclipse/jetty/ee9/maven/plugin/TestForkedChild.java
index dd26c1c1ed47..55fa53d1beb8 100644
--- a/jetty-ee9/jetty-ee9-maven-plugin/src/test/java/org/eclipse/jetty/ee9/maven/plugin/TestForkedChild.java
+++ b/jetty-ee9/jetty-ee9-maven-plugin/src/test/java/org/eclipse/jetty/ee9/maven/plugin/TestForkedChild.java
@@ -89,7 +89,7 @@ public void run()
webapp.setBaseResourceAsPath(baseDir.toPath());
WebAppPropertyConverter.toProperties(webapp, webappPropsFile, null);
child = new JettyForkedChild(cmd.toArray(new String[0]));
- child.jetty.setExitVm(false); //ensure jetty doesn't stop vm for testing
+ child.getJettyEmbedder().setExitVm(false); //ensure jetty doesn't stop vm for testing
child.start();
}
catch (Exception e)
diff --git a/jetty-ee9/jetty-ee9-maven-plugin/src/test/java/org/eclipse/jetty/ee9/maven/plugin/TestJettyEmbedder.java b/jetty-ee9/jetty-ee9-maven-plugin/src/test/java/org/eclipse/jetty/ee9/maven/plugin/TestJettyEmbedder.java
index c8ac2df17226..ac4d077ec763 100644
--- a/jetty-ee9/jetty-ee9-maven-plugin/src/test/java/org/eclipse/jetty/ee9/maven/plugin/TestJettyEmbedder.java
+++ b/jetty-ee9/jetty-ee9-maven-plugin/src/test/java/org/eclipse/jetty/ee9/maven/plugin/TestJettyEmbedder.java
@@ -20,6 +20,8 @@
import java.util.Map;
import org.eclipse.jetty.ee9.servlet.ListenerHolder;
+import org.eclipse.jetty.maven.MavenServerConnector;
+import org.eclipse.jetty.maven.ServerSupport;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.ContextHandler;
import org.eclipse.jetty.server.handler.ContextHandlerCollection;
@@ -121,7 +123,7 @@ public void testJettyEmbedder(WorkDir workDir)
assertTrue(contexts.contains(webApp));
//stop the webapp and check durable listener retained
- jetty.getWebApp().stop();
+ jetty.stopWebApp();
boolean someListener = false;
for (ListenerHolder h : webApp.getServletHandler().getListeners())
{
diff --git a/jetty-ee9/jetty-ee9-maven-plugin/src/test/java/org/eclipse/jetty/ee9/maven/plugin/TestSelectiveJarResource.java b/jetty-ee9/jetty-ee9-maven-plugin/src/test/java/org/eclipse/jetty/ee9/maven/plugin/TestSelectiveJarResource.java
index dba232cc86bc..84538ea0ad73 100644
--- a/jetty-ee9/jetty-ee9-maven-plugin/src/test/java/org/eclipse/jetty/ee9/maven/plugin/TestSelectiveJarResource.java
+++ b/jetty-ee9/jetty-ee9-maven-plugin/src/test/java/org/eclipse/jetty/ee9/maven/plugin/TestSelectiveJarResource.java
@@ -18,6 +18,7 @@
import java.util.ArrayList;
import java.util.List;
+import org.eclipse.jetty.maven.SelectiveJarResource;
import org.eclipse.jetty.toolchain.test.MavenTestingUtils;
import org.eclipse.jetty.toolchain.test.jupiter.WorkDir;
import org.eclipse.jetty.toolchain.test.jupiter.WorkDirExtension;
diff --git a/jetty-home/src/main/resources/bin/jetty.sh b/jetty-home/src/main/resources/bin/jetty.sh
index 005e542c145f..738bb8611847 100755
--- a/jetty-home/src/main/resources/bin/jetty.sh
+++ b/jetty-home/src/main/resources/bin/jetty.sh
@@ -712,7 +712,7 @@ case "$ACTION" in
restart)
JETTY_SH=$0
- > "$JETTY_STATE"
+ echo "restart" >> "$JETTY_STATE"
if [ ! -f $JETTY_SH ]; then
if [ ! -f $JETTY_HOME/bin/jetty.sh ]; then
echo "$JETTY_HOME/bin/jetty.sh does not exist."
diff --git a/pom.xml b/pom.xml
index 96daf3e8f11d..d858f707c167 100644
--- a/pom.xml
+++ b/pom.xml
@@ -155,13 +155,13 @@
1.11.3
4.5.14
4.4.16
- 2.2.6
+ 3.0.0
false
2.3.0
- 2.5.12
+ 3.0.0-alpha.2
9.7
4.2.1
- 6.4.1
+ 7.0.0
3.5.0
1.5
3.2.0
@@ -182,14 +182,14 @@
1.6.0
2.26.1
4.0.6
- 1.62.2
+ 1.63.0
2.10.1
33.1.0-jre
7.0.0
1.0.11
2.2
- 5.3.6
- 7.1.0.Final
+ 5.4.0
+ 7.1.1.Final
infinispan/server
15.0.1.Final-1
5.0.2.Final
@@ -198,9 +198,9 @@
false
false
2.17.0
- 0.8.11
+ 0.8.12
false
- 3.0.4.Final
+ 3.0.5.Final
3.6.1.Final
2.2.1.Final
2.2.1.Final
@@ -235,13 +235,13 @@
4.3
${project.build.directory}/local-repo
2.23.1
- 1.5.3
+ 1.5.6
9.9.2
10.3.6
3.3.3
0.13.1
1.1.0
- 3.11.0
+ 3.12.0
3.1.0
3.7.1
5.1.9
@@ -257,15 +257,15 @@
3.2.2
3.1.1
3.6.1
- 3.3.0
+ 3.4.1
3.6.3
- 3.11.0
+ 3.12.0
3.0.1
3.2.0
1.9.18
3.3.1
- 3.5.2
- 3.3.0
+ 3.5.3
+ 3.3.1
3.2.5
3.9.0
@@ -296,7 +296,7 @@
4.13.5
2.6.14
2.2.0
- 4.0.0
+ 4.0.1
4.0.3
2023-06-05T23:12:49Z
UTF-8
@@ -714,6 +714,11 @@
jetty-keystore
${project.version}
]
+
+ org.eclipse.jetty
+ jetty-maven
+ ${project.version}
+
org.eclipse.jetty
jetty-nosql
diff --git a/tests/test-distribution/test-distribution-common/src/test/java/org/eclipse/jetty/tests/distribution/jettysh/JettyShStartTest.java b/tests/test-distribution/test-distribution-common/src/test/java/org/eclipse/jetty/tests/distribution/jettysh/JettyShStartTest.java
index 0b86810eb7d5..35cecca61075 100644
--- a/tests/test-distribution/test-distribution-common/src/test/java/org/eclipse/jetty/tests/distribution/jettysh/JettyShStartTest.java
+++ b/tests/test-distribution/test-distribution-common/src/test/java/org/eclipse/jetty/tests/distribution/jettysh/JettyShStartTest.java
@@ -191,6 +191,112 @@ public void testStartStopJettyBase(ImageFromDSL jettyImage) throws Exception
}
}
+ @ParameterizedTest
+ @MethodSource("jettyImages")
+ public void testStartRestartStopJettyBase(ImageFromDSL jettyImage) throws Exception
+ {
+ ensureParentImagesExist(jettyImage);
+
+ try (GenericContainer> genericContainer = new GenericContainer<>(jettyImage))
+ {
+ genericContainer.withImagePullPolicy(PullPolicy.defaultPolicy());
+ genericContainer.setWaitStrategy(new ShellStrategy().withCommand("id"));
+
+ genericContainer.withExposedPorts(80, 8080) // jetty
+ .withCommand("/bin/sh", "-c", "while true; do pwd | nc -l -p 80; done")
+ .withStartupAttempts(2)
+ .withStartupCheckStrategy(new IsRunningStartupCheckStrategy())
+ .start();
+
+ LOG.info("Started: " + jettyImage.getDockerImageName());
+
+ System.err.println("== jetty.sh start ==");
+ Container.ExecResult result = genericContainer.execInContainer("/var/test/jetty-home/bin/jetty.sh", "start");
+ assertThat(result.getExitCode(), is(0));
+ /*
+ * Example successful output
+ * ----
+ * STDOUT:
+ * Starting Jetty: . started
+ * OK Wed Oct 18 19:29:35 UTC 2023
+ * ----
+ */
+ Awaitility.await().atMost(Duration.ofSeconds(5)).until(result::getStdout,
+ allOf(
+ containsString("Starting Jetty:"),
+ containsString("\nOK ")
+ ));
+
+ startHttpClient();
+
+ URI containerUriRoot = URI.create("http://" + genericContainer.getHost() + ":" + genericContainer.getMappedPort(8080) + "/");
+ LOG.debug("Container URI Root: {}", containerUriRoot);
+
+ System.err.println("== Attempt GET request to service ==");
+ ContentResponse response = client.GET(containerUriRoot);
+ assertEquals(HttpStatus.NOT_FOUND_404, response.getStatus(), new ResponseDetails(response));
+ assertThat(response.getContentAsString(), containsString("Powered by Eclipse Jetty:// Server"));
+
+ System.err.println("== jetty.sh status (should be running) ==");
+ result = genericContainer.execInContainer("/var/test/jetty-home/bin/jetty.sh", "status");
+ assertThat(result.getExitCode(), is(0));
+ Awaitility.await().atMost(Duration.ofSeconds(5)).until(result::getStdout,
+ containsString("Jetty running pid"));
+
+ System.err.println("== jetty.sh restart ==");
+ result = genericContainer.execInContainer("/var/test/jetty-home/bin/jetty.sh", "restart");
+ assertThat(result.getExitCode(), is(0));
+ Awaitility.await().atMost(Duration.ofSeconds(5)).until(result::getStdout,
+ allOf(
+ containsString("Starting Jetty:"),
+ containsString("\nOK ")
+ ));
+
+ System.err.println("== Attempt GET request to service ==");
+ response = client.GET(containerUriRoot);
+ assertEquals(HttpStatus.NOT_FOUND_404, response.getStatus(), new ResponseDetails(response));
+ assertThat(response.getContentAsString(), containsString("Powered by Eclipse Jetty:// Server"));
+
+ System.err.println("== jetty.sh status (should be running) ==");
+ result = genericContainer.execInContainer("/var/test/jetty-home/bin/jetty.sh", "status");
+ assertThat(result.getExitCode(), is(0));
+ Awaitility.await().atMost(Duration.ofSeconds(5)).until(result::getStdout,
+ containsString("Jetty running pid"));
+
+ System.err.println("== jetty.sh stop ==");
+ result = genericContainer.execInContainer("/var/test/jetty-home/bin/jetty.sh", "stop");
+ assertThat(result.getExitCode(), is(0));
+ /* Looking for output from jetty.sh indicating a stopped jetty.
+ * STDOUT Example 1
+ * ----
+ * Stopping Jetty: OK\n
+ * ----
+ * STOUT Example 2
+ * ----
+ * Stopping Jetty: .Killed 12345\n
+ * OK\n
+ * ----
+ */
+ Awaitility.await().atMost(Duration.ofSeconds(5)).until(result::getStdout,
+ matchesRegex("Stopping Jetty: .*[\n]?OK[\n]"));
+
+ System.err.println("== jetty.sh status (should be stopped) ==");
+ result = genericContainer.execInContainer("/var/test/jetty-home/bin/jetty.sh", "status");
+ assertThat(result.getExitCode(), is(1));
+ Awaitility.await().atMost(Duration.ofSeconds(5)).until(result::getStdout,
+ containsString("Jetty NOT running"));
+
+ System.err.println("== Attempt GET request to non-existent service ==");
+ client.setConnectTimeout(1000);
+ Exception failedGetException = assertThrows(Exception.class, () -> client.GET(containerUriRoot));
+ // GET failure can result in either exception below (which one is based on timing / race)
+ assertThat(failedGetException, anyOf(
+ instanceOf(ExecutionException.class),
+ instanceOf(AsynchronousCloseException.class))
+ );
+ }
+ }
+
private void ensureParentImagesExist(ImageFromDSL jettyImage)
{
// The build stack for images
diff --git a/tests/test-distribution/test-ee10-distribution/src/test/java/org/eclipse/jetty/ee10/tests/distribution/DisableUrlCacheTest.java b/tests/test-distribution/test-ee10-distribution/src/test/java/org/eclipse/jetty/ee10/tests/distribution/DisableUrlCacheTest.java
index fbc353bd5215..918a38c08dca 100644
--- a/tests/test-distribution/test-ee10-distribution/src/test/java/org/eclipse/jetty/ee10/tests/distribution/DisableUrlCacheTest.java
+++ b/tests/test-distribution/test-ee10-distribution/src/test/java/org/eclipse/jetty/ee10/tests/distribution/DisableUrlCacheTest.java
@@ -18,6 +18,7 @@
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.attribute.FileTime;
+import java.util.List;
import java.util.concurrent.TimeUnit;
import org.eclipse.jetty.client.ContentResponse;
@@ -28,6 +29,8 @@
import org.eclipse.jetty.toolchain.test.FS;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.parallel.Isolated;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsString;
@@ -38,6 +41,8 @@
@Isolated
public class DisableUrlCacheTest extends AbstractJettyHomeTest
{
+ private static final Logger LOG = LoggerFactory.getLogger(DisableUrlCacheTest.class);
+
@Test
public void testReloadWebAppWithLog4j2() throws Exception
{
@@ -46,10 +51,11 @@ public void testReloadWebAppWithLog4j2() throws Exception
JettyHomeTester distribution = JettyHomeTester.Builder.newInstance()
.jettyVersion(jettyVersion)
.jettyBase(jettyBase)
+ .jvmArgs(List.of("-Dorg.eclipse.jetty.deploy.LEVEL=DEBUG"))
.build();
String[] setupArgs = {
- "--add-to-start=http,ee10-webapp,ee10-deploy,disable-urlcache"
+ "--add-modules=http,ee10-webapp,ee10-deploy,disable-urlcache"
};
try (JettyHomeTester.Run setupRun = distribution.start(setupArgs))
@@ -65,6 +71,9 @@ public void testReloadWebAppWithLog4j2() throws Exception
Path tempDir = distribution.getJettyBase().resolve("work");
FS.ensureEmpty(tempDir);
+ Path resourcesDir = distribution.getJettyBase().resolve("resources");
+ FS.ensureEmpty(resourcesDir);
+
Path webappsDir = distribution.getJettyBase().resolve("webapps");
String warXml = """
@@ -79,6 +88,17 @@ public void testReloadWebAppWithLog4j2() throws Exception
Path warXmlPath = webappsDir.resolve("test.xml");
Files.writeString(warXmlPath, warXml, StandardCharsets.UTF_8);
+ Path loggingFile = resourcesDir.resolve("jetty-logging.properties");
+ String loggingConfig = """
+ org.eclipse.jetty.LEVEL=INFO
+ org.eclipse.jetty.deploy.LEVEL=DEBUG
+ org.eclipse.jetty.ee10.webapp.LEVEL=DEBUG
+ org.eclipse.jetty.ee10.webapp.WebAppClassLoader.LEVEL=INFO
+ org.eclipse.jetty.ee10.servlet.LEVEL=DEBUG
+ """;
+ Files.writeString(loggingFile, loggingConfig, StandardCharsets.UTF_8);
+
+
int port = Tester.freePort();
String[] runArgs = {
"jetty.http.port=" + port,
@@ -100,13 +120,15 @@ public void testReloadWebAppWithLog4j2() throws Exception
run2.getLogs().clear();
touch(warXmlPath);
- // Wait for reload
+ // Wait for reload to start context
assertTrue(run2.awaitConsoleLogsFor("Started oeje10w.WebAppContext@", START_TIMEOUT, TimeUnit.SECONDS));
+ // wait for deployer node to complete so context is Started not Starting
+ assertTrue(run2.awaitConsoleLogsFor("Executing Node Node[started]", START_TIMEOUT, TimeUnit.SECONDS));
// Is webapp still there?
response = client.GET("http://localhost:" + port + "/test/log/");
- assertThat(response.getStatus(), is(HttpStatus.OK_200));
content = response.getContentAsString();
+ assertThat(content, response.getStatus(), is(HttpStatus.OK_200));
assertThat(content, containsString("GET at LogServlet"));
}
}
@@ -114,6 +136,7 @@ public void testReloadWebAppWithLog4j2() throws Exception
private void touch(Path path) throws IOException
{
+ LOG.info("Touch: {}", path);
FileTime now = FileTime.fromMillis(System.currentTimeMillis() + 2000);
Files.setLastModifiedTime(path, now);
}