mirror of https://github.com/apache/maven.git
o Added consistency checks for class loaders to catch the cause for MNG-1898 at its base
git-svn-id: https://svn.apache.org/repos/asf/maven/core-integration-testing/trunk@704671 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
00ec745e95
commit
50e4f43b57
|
@ -30,6 +30,7 @@ import java.io.OutputStream;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.lang.reflect.Modifier;
|
import java.lang.reflect.Modifier;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
|
import java.net.URLClassLoader;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
|
@ -116,6 +117,18 @@ public class LoadMojo
|
||||||
{
|
{
|
||||||
getLog().info( "[MAVEN-CORE-IT-LOG] Using class loader " + classLoader );
|
getLog().info( "[MAVEN-CORE-IT-LOG] Using class loader " + classLoader );
|
||||||
|
|
||||||
|
/*
|
||||||
|
* NOTE: This one is a little subtle. For all properly implemented class loaders, loading a class/resource from
|
||||||
|
* a child class loader (with the usual parent-first delegation and no additional search path) will deliver the
|
||||||
|
* same result as loading directly from the parent class loader. However, Maven or better Plexus Classworlds
|
||||||
|
* employs custom class loaders which - as history has shown (MNG-1898) - might not always be cleanly
|
||||||
|
* implemented. To catch potential class loader defects, we check both the results from the original class
|
||||||
|
* loader and a delegating child class loader for consistency. The key point is that querying the child class
|
||||||
|
* loader will use a slightly different code path in the original class loader during parent delegation, thereby
|
||||||
|
* increasing test coverage for its implementation.
|
||||||
|
*/
|
||||||
|
ClassLoader childClassLoader = new URLClassLoader( new URL[0], classLoader );
|
||||||
|
|
||||||
Properties loaderProperties = new Properties();
|
Properties loaderProperties = new Properties();
|
||||||
|
|
||||||
if ( classNames != null && classNames.length() > 0 )
|
if ( classNames != null && classNames.length() > 0 )
|
||||||
|
@ -126,10 +139,19 @@ public class LoadMojo
|
||||||
String name = names[i];
|
String name = names[i];
|
||||||
getLog().info( "[MAVEN-CORE-IT-LOG] Loading class " + name );
|
getLog().info( "[MAVEN-CORE-IT-LOG] Loading class " + name );
|
||||||
|
|
||||||
// test ClassLoader.loadClass()
|
// test ClassLoader.loadClass(String) and (indirectly) ClassLoader.loadClass(String, boolean)
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
Class type = classLoader.loadClass( name );
|
Class type = classLoader.loadClass( name );
|
||||||
|
try
|
||||||
|
{
|
||||||
|
type = childClassLoader.loadClass( name );
|
||||||
|
}
|
||||||
|
catch ( ClassNotFoundException cnfe )
|
||||||
|
{
|
||||||
|
getLog().error( "[MAVEN-CORE-IT-LOG] Detected class loader defect while loading " + name );
|
||||||
|
throw cnfe;
|
||||||
|
}
|
||||||
loaderProperties.setProperty( name, "" + type.hashCode() );
|
loaderProperties.setProperty( name, "" + type.hashCode() );
|
||||||
|
|
||||||
Method[] methods = type.getDeclaredMethods();
|
Method[] methods = type.getDeclaredMethods();
|
||||||
|
@ -171,6 +193,11 @@ public class LoadMojo
|
||||||
|
|
||||||
// test ClassLoader.getResource()
|
// test ClassLoader.getResource()
|
||||||
URL url = classLoader.getResource( path );
|
URL url = classLoader.getResource( path );
|
||||||
|
if ( url != null && !url.equals( childClassLoader.getResource( path ) ) )
|
||||||
|
{
|
||||||
|
getLog().error( "[MAVEN-CORE-IT-LOG] Detected class loader defect while getting " + path );
|
||||||
|
url = null;
|
||||||
|
}
|
||||||
if ( url != null )
|
if ( url != null )
|
||||||
{
|
{
|
||||||
loaderProperties.setProperty( path, url.toString() );
|
loaderProperties.setProperty( path, url.toString() );
|
||||||
|
@ -180,6 +207,11 @@ public class LoadMojo
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
List urls = Collections.list( classLoader.getResources( path ) );
|
List urls = Collections.list( classLoader.getResources( path ) );
|
||||||
|
if ( !urls.equals( Collections.list( childClassLoader.getResources( path ) ) ) )
|
||||||
|
{
|
||||||
|
getLog().error( "[MAVEN-CORE-IT-LOG] Detected class loader defect while getting " + path );
|
||||||
|
urls = Collections.EMPTY_LIST;
|
||||||
|
}
|
||||||
loaderProperties.setProperty( path + ".count", "" + urls.size() );
|
loaderProperties.setProperty( path + ".count", "" + urls.size() );
|
||||||
for ( int j = 0; j < urls.size(); j++ )
|
for ( int j = 0; j < urls.size(); j++ )
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue