Explorar el Código

AMBARI-11468 - Views : ClassLoader conflict with com.sun.jersey classes (tbeerbower)

tbeerbower hace 10 años
padre
commit
087d9003ec

+ 9 - 9
ambari-project/pom.xml

@@ -301,12 +301,12 @@
       <dependency>
         <groupId>com.sun.jersey</groupId>
         <artifactId>jersey-core</artifactId>
-        <version>1.11</version>
+        <version>1.18</version>
       </dependency>
       <dependency>
         <groupId>com.sun.jersey</groupId>
         <artifactId>jersey-grizzly</artifactId>
-        <version>1.11</version>
+        <version>1.18</version>
       </dependency>
       <dependency>
         <groupId>org.codehaus.jackson</groupId>
@@ -341,17 +341,17 @@
       <dependency>
         <groupId>com.sun.jersey</groupId>
         <artifactId>jersey-bundle</artifactId>
-        <version>1.11</version>
+        <version>1.18</version>
       </dependency>
       <dependency>
         <groupId>com.sun.jersey</groupId>
         <artifactId>jersey-json</artifactId>
-        <version>1.11</version>
+        <version>1.18</version>
       </dependency>
       <dependency>
         <groupId>com.sun.jersey</groupId>
         <artifactId>jersey-server</artifactId>
-        <version>1.11</version>
+        <version>1.18</version>
       </dependency>
       <dependency>
         <groupId>com.sun.jersey</groupId>
@@ -361,23 +361,23 @@
       <dependency>
         <groupId>com.sun.jersey.contribs</groupId>
         <artifactId>jersey-multipart</artifactId>
-        <version>1.11</version>
+        <version>1.18</version>
       </dependency>
       <dependency>
         <groupId>com.sun.jersey.jersey-test-framework</groupId>
         <artifactId>jersey-test-framework-core</artifactId>
-        <version>1.11</version>
+        <version>1.18</version>
         <scope>test</scope>
       </dependency>
       <dependency>
         <groupId>com.sun.jersey.jersey-test-framework</groupId>
         <artifactId>jersey-test-framework-grizzly2</artifactId>
-        <version>1.11</version>
+        <version>1.18</version>
       </dependency>
       <dependency>
         <groupId>com.sun.jersey.contribs</groupId>
         <artifactId>jersey-guice</artifactId>
-        <version>1.11</version>
+        <version>1.18</version>
       </dependency>
       <dependency>
         <groupId>log4j</groupId>

+ 7 - 1
ambari-server/src/main/java/org/apache/ambari/server/view/ViewClassLoader.java

@@ -71,10 +71,16 @@ public class ViewClassLoader extends WebAppClassLoader {
 
     WebAppContext webAppContext = new WebAppContext();
 
+    // add ambari classes as system classes
+    webAppContext.addSystemClass("org.apache.ambari.server.");
+    webAppContext.addSystemClass("org.apache.ambari.view.");
+
     // add com.google.inject as system classes to allow for injection in view components using the google annotation
     webAppContext.addSystemClass("com.google.inject.");
-    // add org.slf4j as system classes to avoid linkage errors
+
+    // add as system classes to avoid conflicts and linkage errors
     webAppContext.addSystemClass("org.slf4j.");
+    webAppContext.addSystemClass("com.sun.jersey.");
 
     // set the class loader settings from the configuration
     if (viewConfig != null) {

+ 17 - 5
ambari-server/src/test/java/org/apache/ambari/server/view/ViewClassLoaderTest.java

@@ -74,9 +74,12 @@ public class ViewClassLoaderTest {
     expect(parentClassLoader.getPackage("org.apache.ambari.server.view")).andReturn(null).anyTimes();
     expect(parentClassLoader.loadClass("java.lang.Object")).andReturn(parentClass).anyTimes();
     expect(parentClassLoader.loadClass("ParentClass")).andReturn(parentClass).once();
+    expect(parentClassLoader.loadClass("org.apache.ambari.server.controller.spi.ResourceProvider")).andReturn(parentClass).once();
+    expect(parentClassLoader.loadClass("org.apache.ambari.view.ViewContext")).andReturn(parentClass).once();
     expect(parentClassLoader.loadClass("javax.xml.parsers.SAXParserFactory")).andReturn(parentClass).once();
     expect(parentClassLoader.loadClass("com.google.inject.AbstractModule")).andReturn(parentClass).once();
     expect(parentClassLoader.loadClass("org.slf4j.LoggerFactory")).andReturn(parentClass).once();
+    expect(parentClassLoader.loadClass("com.sun.jersey.api.ConflictException")).andReturn(parentClass).once();
 
     replay(parentClassLoader, viewConfig);
 
@@ -87,33 +90,42 @@ public class ViewClassLoaderTest {
 
     ViewClassLoader classLoader = new ViewClassLoader(viewConfig, parentClassLoader, urls);
 
-    Class clazz = classLoader.loadClass("org.apache.ambari.server.view.ViewClassLoaderTest");
+    // should be loaded by parent loader
+    Class clazz = classLoader.loadClass("ParentClass");
 
     Assert.assertNotNull(clazz);
+    Assert.assertSame(parentClass, clazz);
 
-    clazz = classLoader.loadClass("ParentClass");
+    clazz = classLoader.loadClass("org.apache.ambari.server.controller.spi.ResourceProvider");
+
+    Assert.assertNotNull(clazz);
+    Assert.assertSame(parentClass, clazz);
+
+    clazz = classLoader.loadClass("org.apache.ambari.view.ViewContext");
 
     Assert.assertNotNull(clazz);
     Assert.assertSame(parentClass, clazz);
 
-    // should be loaded by parent loader
     clazz = classLoader.loadClass("javax.xml.parsers.SAXParserFactory");
 
     Assert.assertNotNull(clazz);
     Assert.assertSame(parentClass, clazz);
 
-    // should be loaded by parent loader
     clazz = classLoader.loadClass("com.google.inject.AbstractModule");
 
     Assert.assertNotNull(clazz);
     Assert.assertSame(parentClass, clazz);
 
-    // should be loaded by parent loader
     clazz = classLoader.loadClass("org.slf4j.LoggerFactory");
 
     Assert.assertNotNull(clazz);
     Assert.assertSame(parentClass, clazz);
 
+    clazz = classLoader.loadClass("com.sun.jersey.api.ConflictException");
+
+    Assert.assertNotNull(clazz);
+    Assert.assertSame(parentClass, clazz);
+
     verify(parentClassLoader, viewConfig);
   }