You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by rm...@apache.org on 2017/05/04 09:57:54 UTC
tomee git commit: fixing saaj-impl dependency,
updating Bootstrap to support another classloader than the system one
Repository: tomee
Updated Branches:
refs/heads/master a455fd3ab -> 31e2251cc
fixing saaj-impl dependency, updating Bootstrap to support another classloader than the system one
Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/31e2251c
Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/31e2251c
Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/31e2251c
Branch: refs/heads/master
Commit: 31e2251ccac069a319706f4e3eb4f7b806bc3649
Parents: a455fd3
Author: rmannibucau <rm...@apache.org>
Authored: Thu May 4 11:57:47 2017 +0200
Committer: rmannibucau <rm...@apache.org>
Committed: Thu May 4 11:57:47 2017 +0200
----------------------------------------------------------------------
.../java/org/apache/openejb/cli/Bootstrap.java | 37 ++++--
.../util/classloader/URLClassLoaderFirst.java | 5 +-
.../openejb/loader/BasicURLClassPath.java | 119 +++++++++++++++++--
.../apache/openejb/loader/SystemClassPath.java | 27 ++++-
examples/pom.xml | 17 +++
examples/webservice-ws-security/pom.xml | 28 +++--
.../openejb/itest/failover/Repository.java | 1 -
.../server/control/StandaloneServer.java | 12 ++
.../RoundRobinConnectionStrategyTest.java | 9 +-
server/openejb-cxf/pom.xml | 37 +++++-
10 files changed, 252 insertions(+), 40 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tomee/blob/31e2251c/container/openejb-core/src/main/java/org/apache/openejb/cli/Bootstrap.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/cli/Bootstrap.java b/container/openejb-core/src/main/java/org/apache/openejb/cli/Bootstrap.java
index 912f7d1..98f8741 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/cli/Bootstrap.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/cli/Bootstrap.java
@@ -17,6 +17,7 @@
package org.apache.openejb.cli;
+import org.apache.openejb.loader.ClassPath;
import org.apache.openejb.loader.IO;
import org.apache.openejb.loader.SystemClassPath;
import org.apache.openejb.util.JavaSecurityManagers;
@@ -24,6 +25,7 @@ import org.apache.openejb.util.PropertyPlaceHolderHelper;
import org.apache.openejb.util.URLs;
import java.io.File;
+import java.lang.reflect.InvocationTargetException;
import java.net.URI;
import java.net.URL;
import java.util.StringTokenizer;
@@ -85,12 +87,13 @@ public class Bootstrap {
JavaSecurityManagers.setSystemProperty(prop, val);
}
- private static void setupClasspath() {
+ private static ClassLoader setupClasspath() {
final String base = JavaSecurityManagers.getSystemProperty(OPENEJB_BASE_PROPERTY_NAME, "");
final String home = JavaSecurityManagers.getSystemProperty("catalina.home", JavaSecurityManagers.getSystemProperty(OPENEJB_HOME_PROPERTY_NAME, base));
try {
final File lib = new File(home + File.separator + "lib");
- final SystemClassPath systemCP = new SystemClassPath();
+ final ClassPath systemCP = new SystemClassPath();
+ systemCP.getClassLoader();
File config = new File(base, "conf/catalina.properties");
if (!config.isFile()) {
config = new File(home, "conf/catalina.properties");
@@ -131,10 +134,12 @@ public class Bootstrap {
systemCP.addJarsToPath(lib);
systemCP.addJarToPath(lib.toURI().toURL());
}
+ return systemCP.getClassLoader();
} catch (final Exception e) {
System.err.println("Error setting up the classpath: " + e.getClass() + ": " + e.getMessage());
e.printStackTrace();
}
+ return null;
}
/**
@@ -142,14 +147,30 @@ public class Bootstrap {
*/
public static void main(final String[] args) throws Exception {
setupHome(args);
- setupClasspath();
+ final ClassLoader loader = setupClasspath();
+ if (loader != null) {
+ Thread.currentThread().setContextClassLoader(loader);
+ if (loader != ClassLoader.getSystemClassLoader()) {
+ System.setProperty("openejb.classloader.first.disallow-system-loading", "true");
+ }
+ }
- final Class<?> clazz = Bootstrap.class.getClassLoader().loadClass(OPENEJB_CLI_MAIN_CLASS_NAME);
- final Main main = (Main) clazz.newInstance();
+ final Class<?> clazz = (loader == null ? Bootstrap.class.getClassLoader() : loader).loadClass(OPENEJB_CLI_MAIN_CLASS_NAME);
try {
- main.main(args);
- } catch (final SystemExitException e) {
- System.exit(e.getExitCode());
+ final Object main = clazz.getConstructor().newInstance();
+ main.getClass().getMethod("main", String[].class).invoke(main, new Object[]{args});
+ } catch (final InvocationTargetException e) {
+ final Throwable cause = e.getCause();
+ if ("org.apache.openejb.cli.SystemExitException".equals(cause.getClass().getName())) {
+ System.exit(Number.class.cast(cause.getClass().getMethod("getExitCode").invoke(cause)).intValue());
+ }
+ if (Exception.class.isInstance(cause)) {
+ throw Exception.class.cast(cause);
+ }
+ if (Error.class.isInstance(cause)) {
+ throw Error.class.cast(cause);
+ }
+ throw new IllegalStateException(cause);
}
}
http://git-wip-us.apache.org/repos/asf/tomee/blob/31e2251c/container/openejb-core/src/main/java/org/apache/openejb/util/classloader/URLClassLoaderFirst.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/util/classloader/URLClassLoaderFirst.java b/container/openejb-core/src/main/java/org/apache/openejb/util/classloader/URLClassLoaderFirst.java
index 2bcd151..a8dcfb6 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/util/classloader/URLClassLoaderFirst.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/util/classloader/URLClassLoaderFirst.java
@@ -58,6 +58,7 @@ public class URLClassLoaderFirst extends URLClassLoader {
private static final URL SLF4J_CONTAINER = URLClassLoaderFirst.class.getClassLoader().getResource(SLF4J_BINDER_CLASS);
private static final String CLASS_EXT = ".class";
public static final ClassLoader SYSTEM_CLASS_LOADER = ClassLoader.getSystemClassLoader();
+ private static final boolean ALLOW_OPEN_EJB_SYSTEM_LOADING = !Boolean.getBoolean("openejb.classloader.first.disallow-system-loading");
public static void reloadConfig() {
list(FORCED_SKIP, "openejb.classloader.forced-skip");
@@ -111,7 +112,7 @@ public class URLClassLoaderFirst extends URLClassLoader {
}
return clazz;
}
- } catch (final ClassNotFoundException ignored) {
+ } catch (final NoClassDefFoundError | ClassNotFoundException ignored) {
// no-op
}
}
@@ -187,7 +188,7 @@ public class URLClassLoaderFirst extends URLClassLoader {
// we skip webapp enrichment jars since we want to load them from the webapp or lib
// Note: this is not a real limitation since it is first fail it will be done later
public static boolean canBeLoadedFromSystem(final String name) {
- return !name.startsWith("org.apache.openejb.") || !isWebAppEnrichment(name.substring("org.apache.openejb.".length()));
+ return ALLOW_OPEN_EJB_SYSTEM_LOADING && (!name.startsWith("org.apache.openejb.") || !isWebAppEnrichment(name.substring("org.apache.openejb.".length())));
}
// making all these call inline if far more costly than factorizing packages
http://git-wip-us.apache.org/repos/asf/tomee/blob/31e2251c/container/openejb-loader/src/main/java/org/apache/openejb/loader/BasicURLClassPath.java
----------------------------------------------------------------------
diff --git a/container/openejb-loader/src/main/java/org/apache/openejb/loader/BasicURLClassPath.java b/container/openejb-loader/src/main/java/org/apache/openejb/loader/BasicURLClassPath.java
index 77ed793..d459664 100644
--- a/container/openejb-loader/src/main/java/org/apache/openejb/loader/BasicURLClassPath.java
+++ b/container/openejb-loader/src/main/java/org/apache/openejb/loader/BasicURLClassPath.java
@@ -37,11 +37,15 @@ public abstract class BasicURLClassPath implements ClassPath {
}
private Field ucpField;
+ private boolean ucpFieldErrorLogged;
protected void addJarToPath(final URL jar, final URLClassLoader loader) throws Exception {
final Object cp = getURLClassPath(loader);
- final Method addURLMethod = getAddURLMethod(loader);
- addURLMethod.invoke(cp, jar);
+ if (cp == null && CustomizableURLClassLoader.class.isInstance(loader)) {
+ CustomizableURLClassLoader.class.cast(loader).add(jar);
+ } else {
+ getAddURLMethod(loader).invoke(cp, jar);
+ }
}
private Method getAddURLMethod(final URLClassLoader loader) {
@@ -54,7 +58,7 @@ public abstract class BasicURLClassPath implements ClassPath {
final Class<?> clazz = cp.getClass();
return clazz.getDeclaredMethod("addURL", URL.class);
} catch (final Exception e) {
- e.printStackTrace();
+ System.err.println("Can't access addURL from URLClassPath");
}
return null;
@@ -89,14 +93,30 @@ public abstract class BasicURLClassPath implements ClassPath {
}
final Object cp = getURLClassPath(loader);
- final Method addURLMethod = getAddURLMethod(loader);
- for (final URL jar : jars) {
- addURLMethod.invoke(cp, jar);
+ if (cp == null && CustomizableURLClassLoader.class.isInstance(loader)) {
+ final CustomizableURLClassLoader customizableURLClassLoader = CustomizableURLClassLoader.class.cast(loader);
+ for (final URL jar : jars) {
+ customizableURLClassLoader.add(jar);
+ }
+ } else if (cp == null && loader != null && CustomizableURLClassLoader.class.getName().equals(loader.getClass().getName())) {
+ final Method add = loader.getClass().getMethod("add", URL.class);
+ for (final URL jar : jars) {
+ add.invoke(loader, jar);
+ }
+ } else {
+ final Method addURLMethod = getAddURLMethod(loader);
+ for (final URL jar : jars) {
+ addURLMethod.invoke(cp, jar);
+ }
}
}
protected Object getURLClassPath(final URLClassLoader loader) throws Exception {
- return this.getUcpField().get(loader);
+ final Field ucpField = this.getUcpField();
+ if (ucpField == null) {
+ return null;
+ }
+ return ucpField.get(loader);
}
private Field getUcpField() throws Exception {
@@ -109,7 +129,10 @@ public abstract class BasicURLClassPath implements ClassPath {
ucp.setAccessible(true);
return ucp;
} catch (final Exception e2) {
- e2.printStackTrace();
+ if (!ucpFieldErrorLogged) {
+ System.err.println("Can't get ucp field of URLClassLoader");
+ ucpFieldErrorLogged = true;
+ }
}
return null;
}
@@ -119,4 +142,84 @@ public abstract class BasicURLClassPath implements ClassPath {
return ucpField;
}
+ protected static class CustomizableURLClassLoader extends URLClassLoader {
+ static {
+ ClassLoader.registerAsParallelCapable();
+ }
+
+ protected CustomizableURLClassLoader(final ClassLoader parent) {
+ super(new URL[0], parent);
+ }
+
+ public void add(final URL url) {
+ super.addURL(url);
+ }
+
+ @Override
+ protected Class<?> loadClass(final String name, final boolean resolve) throws ClassNotFoundException {
+ synchronized (getClassLoadingLock(name)) {
+ Class<?> clazz = findLoadedClass(name);
+ if (clazz != null) {
+ if (resolve) {
+ resolveClass(clazz);
+ }
+ return clazz;
+ }
+
+ if (name != null && !name.startsWith("org.apache.openejb")) {
+ try {
+ return getSystemClassLoader().loadClass(name);
+ } catch (final ClassNotFoundException ignored) {
+ // no-op
+ }
+ }
+
+ clazz = loadInternal(name, resolve);
+ if (clazz != null) {
+ return clazz;
+ }
+
+ clazz = loadFromParent(name, resolve);
+ if (clazz != null) {
+ return clazz;
+ }
+
+ throw new ClassNotFoundException(name);
+ }
+ }
+
+ private Class<?> loadFromParent(final String name, final boolean resolve) {
+ ClassLoader parent = getParent();
+ if (parent == null) {
+ parent = getSystemClassLoader();
+ }
+ try {
+ final Class<?> clazz = Class.forName(name, false, parent);
+ if (clazz != null) {
+ if (resolve) {
+ resolveClass(clazz);
+ }
+ return clazz;
+ }
+ } catch (final ClassNotFoundException ignored) {
+ // no-op
+ }
+ return null;
+ }
+
+ private Class<?> loadInternal(final String name, final boolean resolve) {
+ try {
+ final Class<?> clazz = findClass(name);
+ if (clazz != null) {
+ if (resolve) {
+ resolveClass(clazz);
+ }
+ return clazz;
+ }
+ } catch (final ClassNotFoundException ignored) {
+ // no-op
+ }
+ return null;
+ }
+ }
}
http://git-wip-us.apache.org/repos/asf/tomee/blob/31e2251c/container/openejb-loader/src/main/java/org/apache/openejb/loader/SystemClassPath.java
----------------------------------------------------------------------
diff --git a/container/openejb-loader/src/main/java/org/apache/openejb/loader/SystemClassPath.java b/container/openejb-loader/src/main/java/org/apache/openejb/loader/SystemClassPath.java
index 6f87ea9..16f14ef 100644
--- a/container/openejb-loader/src/main/java/org/apache/openejb/loader/SystemClassPath.java
+++ b/container/openejb-loader/src/main/java/org/apache/openejb/loader/SystemClassPath.java
@@ -18,16 +18,19 @@ package org.apache.openejb.loader;
import java.io.File;
import java.lang.reflect.Method;
+import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.net.URLDecoder;
import java.security.AccessController;
import java.security.PrivilegedAction;
+import static org.apache.openejb.loader.JarLocation.jarLocation;
+
/*-------------------------------------------------------*/
/* System ClassLoader Support */
/*-------------------------------------------------------*/
-// TODO: we should get rid of it in favor of a custom root loader or flat classpath (ContextClassPath)
+// TODO: we should get rid of it in favor of a custom root loader or flat classpath (ContextClassPath) and update Bootstrap to handle it
public class SystemClassPath extends BasicURLClassPath {
private URLClassLoader sysLoader;
@@ -35,13 +38,17 @@ public class SystemClassPath extends BasicURLClassPath {
@Override
public void addJarsToPath(final File dir) throws Exception {
this.addJarsToPath(dir, getSystemLoader());
- this.rebuildJavaClassPathVariable();
+ if (getSystemLoader() == ClassLoader.getSystemClassLoader()) {
+ this.rebuildJavaClassPathVariable();
+ }
}
@Override
public void addJarToPath(final URL jar) throws Exception {
this.addJarToPath(jar, getSystemLoader());
- this.rebuildJavaClassPathVariable();
+ if (getSystemLoader() == ClassLoader.getSystemClassLoader()) {
+ this.rebuildJavaClassPathVariable();
+ }
}
@Override
@@ -55,11 +62,23 @@ public class SystemClassPath extends BasicURLClassPath {
private URLClassLoader getSystemLoader() throws Exception {
if (sysLoader == null) {
- sysLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();
+ final ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
+ sysLoader = URLClassLoader.class.isInstance(systemClassLoader) ?
+ URLClassLoader.class.cast(systemClassLoader) : createCustomizableURLClassLoader(systemClassLoader);
}
return sysLoader;
}
+ private CustomizableURLClassLoader createCustomizableURLClassLoader(final ClassLoader systemClassLoader) {
+ final CustomizableURLClassLoader customizableURLClassLoader = new CustomizableURLClassLoader(systemClassLoader);
+ try {
+ customizableURLClassLoader.add(jarLocation(SystemClassPath.class).toURI().toURL());
+ } catch (final MalformedURLException e) {
+ // no-op
+ }
+ return customizableURLClassLoader;
+ }
+
private void rebuildJavaClassPathVariable() throws Exception {
final URLClassLoader loader = getSystemLoader();
final Object cp = getURLClassPath(loader);
http://git-wip-us.apache.org/repos/asf/tomee/blob/31e2251c/examples/pom.xml
----------------------------------------------------------------------
diff --git a/examples/pom.xml b/examples/pom.xml
index 1c0cdfa..db89317 100644
--- a/examples/pom.xml
+++ b/examples/pom.xml
@@ -202,5 +202,22 @@
</plugins>
</build>
</profile>
+ <profile>
+ <id>java9</id>
+ <activation>
+ <jdk>9</jdk>
+ </activation>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <configuration> <!-- requires saaj-impl 1.4 but cxf is not yet ready -->
+ <skip>true</skip>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+ </profile>
</profiles>
</project>
http://git-wip-us.apache.org/repos/asf/tomee/blob/31e2251c/examples/webservice-ws-security/pom.xml
----------------------------------------------------------------------
diff --git a/examples/webservice-ws-security/pom.xml b/examples/webservice-ws-security/pom.xml
index a8e08f6..b444580 100644
--- a/examples/webservice-ws-security/pom.xml
+++ b/examples/webservice-ws-security/pom.xml
@@ -60,14 +60,6 @@
<version>7.0.4-SNAPSHOT</version>
<scope>test</scope>
</dependency>
- <!-- This is required on IBM JDKs (and potentially others) because saaj-impl depends
- on Sun's internal copy of Xerces. See OPENEJB-1126. -->
- <dependency>
- <groupId>com.sun.xml.parsers</groupId>
- <artifactId>jaxp-ri</artifactId>
- <version>1.4.2</version>
- <scope>test</scope>
- </dependency>
</dependencies>
<build>
<defaultGoal>install</defaultGoal>
@@ -149,4 +141,24 @@
<url>file://${basedir}/target/snapshot-repo/</url>
</snapshotRepository>
</distributionManagement>
+
+ <profiles>
+ <profile>
+ <id>java9</id>
+ <activation>
+ <jdk>9</jdk>
+ </activation>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <configuration> <!-- requires saaj-impl 1.4 but cxf is not yet ready -->
+ <skip>true</skip>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+ </profile>
+ </profiles>
</project>
http://git-wip-us.apache.org/repos/asf/tomee/blob/31e2251c/itests/failover/src/main/java/org/apache/openejb/itest/failover/Repository.java
----------------------------------------------------------------------
diff --git a/itests/failover/src/main/java/org/apache/openejb/itest/failover/Repository.java b/itests/failover/src/main/java/org/apache/openejb/itest/failover/Repository.java
index ea95c3d..692d0a2 100644
--- a/itests/failover/src/main/java/org/apache/openejb/itest/failover/Repository.java
+++ b/itests/failover/src/main/java/org/apache/openejb/itest/failover/Repository.java
@@ -16,7 +16,6 @@
*/
package org.apache.openejb.itest.failover;
-import org.apache.openejb.loader.SystemInstance;
import org.apache.openejb.loader.provisining.ProvisioningResolver;
import org.apache.openejb.util.Join;
http://git-wip-us.apache.org/repos/asf/tomee/blob/31e2251c/itests/failover/src/main/java/org/apache/openejb/server/control/StandaloneServer.java
----------------------------------------------------------------------
diff --git a/itests/failover/src/main/java/org/apache/openejb/server/control/StandaloneServer.java b/itests/failover/src/main/java/org/apache/openejb/server/control/StandaloneServer.java
index af447b5..b33006e 100644
--- a/itests/failover/src/main/java/org/apache/openejb/server/control/StandaloneServer.java
+++ b/itests/failover/src/main/java/org/apache/openejb/server/control/StandaloneServer.java
@@ -50,6 +50,7 @@ public class StandaloneServer {
private final File java;
private final File openejbJar;
private boolean debug;
+ private int debugPort = 5005;
private boolean profile;
private volatile Process process;
private final List<String> jvmOpts = new ArrayList<String>();
@@ -198,6 +199,14 @@ public class StandaloneServer {
this.debug = debug;
}
+ public int getDebugPort() {
+ return debugPort;
+ }
+
+ public void setDebugPort(final int debugPort) {
+ this.debugPort = debugPort;
+ }
+
public boolean isProfile() {
return profile;
}
@@ -261,6 +270,9 @@ public class StandaloneServer {
args.addAll(jvmOpts);
final Set<Map.Entry<Object, Object>> collection = properties.entrySet();
args.addAll(Join.strings(collection, new SystemPropertiesCallback()));
+ if (debug) {
+ args.add("-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=" + debugPort);
+ }
args.add("-jar");
args.add(openejbJar.getAbsolutePath());
http://git-wip-us.apache.org/repos/asf/tomee/blob/31e2251c/itests/failover/src/test/java/org/apache/openejb/itest/failover/RoundRobinConnectionStrategyTest.java
----------------------------------------------------------------------
diff --git a/itests/failover/src/test/java/org/apache/openejb/itest/failover/RoundRobinConnectionStrategyTest.java b/itests/failover/src/test/java/org/apache/openejb/itest/failover/RoundRobinConnectionStrategyTest.java
index a05bfbd..92b6e80 100644
--- a/itests/failover/src/test/java/org/apache/openejb/itest/failover/RoundRobinConnectionStrategyTest.java
+++ b/itests/failover/src/test/java/org/apache/openejb/itest/failover/RoundRobinConnectionStrategyTest.java
@@ -77,7 +77,6 @@ public class RoundRobinConnectionStrategyTest {
final File zip = Repository.getArtifact("org.apache.tomee", "openejb-standalone", "zip");
final File app = Repository.getArtifact("org.apache.openejb.itests", "failover-ejb", "jar");
-
final File dir = Files.tmpdir();
final StandaloneServer root;
@@ -90,7 +89,8 @@ public class RoundRobinConnectionStrategyTest {
root = new StandaloneServer(home, home);
root.killOnExit();
- root.getJvmOpts().add("-Dopenejb.classloader.forced-load=org.apache.openejb");
+ // root.setDebug(Boolean.getBoolean("openejb.test.standalone." + name + ".debug"));
+ root.getJvmOpts().add("-Dopenejb.classloader.forced-load=org.apache.openejb.itest");
root.ignoreOut();
root.setProperty("name", name);
root.setProperty("openejb.extract.configuration", "false");
@@ -118,7 +118,8 @@ public class RoundRobinConnectionStrategyTest {
final StandaloneServer server = new StandaloneServer(home, home);
server.killOnExit();
server.ignoreOut();
- server.getJvmOpts().add("-Dopenejb.classloader.forced-load=org.apache.openejb");
+ // server.setDebug(Boolean.getBoolean("openejb.test.standalone." + name + ".debug"));
+ server.getJvmOpts().add("-Dopenejb.classloader.forced-load=org.apache.openejb.itest");
server.setProperty("name", name);
server.setProperty("openejb.extract.configuration", "false");
@@ -144,7 +145,7 @@ public class RoundRobinConnectionStrategyTest {
servers.put(name, server);
- logger.info(String.format("Starting %s server", name));
+ logger.info(String.format("Starting %s server, uri=%s", name, uri));
server.start(1, TimeUnit.MINUTES);
}
http://git-wip-us.apache.org/repos/asf/tomee/blob/31e2251c/server/openejb-cxf/pom.xml
----------------------------------------------------------------------
diff --git a/server/openejb-cxf/pom.xml b/server/openejb-cxf/pom.xml
index 9e9df9f..e707fdd 100644
--- a/server/openejb-cxf/pom.xml
+++ b/server/openejb-cxf/pom.xml
@@ -166,11 +166,6 @@
</exclusion>
</exclusions>
</dependency>
- <dependency>
- <groupId>com.sun.xml.messaging.saaj</groupId>
- <artifactId>saaj-impl</artifactId>
- <version>1.4.0-b03</version>
- </dependency>
<!-- This is required on IBM JDKs (and potentially others) because saaj-impl depends
on Sun's internal copy of Xerces. See OPENEJB-1126. -->
<dependency>
@@ -180,5 +175,37 @@
<scope>test</scope>
</dependency>
</dependencies>
+
+ <profiles>
+ <profile>
+ <id>default-build</id>
+ <activation>
+ <jdk>[1.7,1.9)</jdk>
+ </activation>
+ <dependencies>
+ <dependency>
+ <groupId>com.sun.xml.messaging.saaj</groupId>
+ <artifactId>saaj-impl</artifactId>
+ <version>1.3.23</version>
+ <!-- not yet supported by wss4j/cxf but needed for java 9, when supported we just upgrade since target=1.7 so fine for the main build
+ <version>1.4.0-b03</version>
+ -->
+ </dependency>
+ </dependencies>
+ </profile>
+ <profile>
+ <id>java-9</id>
+ <activation>
+ <jdk>9</jdk>
+ </activation>
+ <dependencies>
+ <dependency>
+ <groupId>com.sun.xml.messaging.saaj</groupId>
+ <artifactId>saaj-impl</artifactId>
+ <version>1.4.0-b03</version>
+ </dependency>
+ </dependencies>
+ </profile>
+ </profiles>
</project>