592 allow to use all test-scope dependencies in the on-the-fly compilation classpath

This commit is contained in:
Andreas Gudian 2015-07-07 11:31:23 +02:00
parent 71f4a4b2ca
commit 4eaacbcfe6
3 changed files with 39 additions and 30 deletions

View File

@ -189,18 +189,6 @@
</artifactItems>
</configuration>
</execution>
<execution>
<id>copy</id>
<phase>generate-test-resources</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/test-dependencies
</outputDirectory>
<stripVersion>true</stripVersion>
</configuration>
</execution>
</executions>
</plugin>
<plugin>

View File

@ -102,12 +102,7 @@ class CompilingStatement extends Statement {
}
};
private static final List<String> LIBRARIES = Arrays.asList(
"mapstruct.jar",
"guava.jar",
"javax.inject.jar",
"joda-time.jar"
);
private static final List<File> COMPILER_CLASSPATH = buildCompilerClasspath();
private Statement next;
private final FrameworkMethod method;
@ -115,7 +110,6 @@ class CompilingStatement extends Statement {
private JavaCompiler compiler;
private String classOutputDir;
private String sourceOutputDir;
private List<File> classPath;
private CompilationRequest compilationRequest;
public CompilingStatement(FrameworkMethod method) {
@ -149,18 +143,48 @@ class CompilingStatement extends Statement {
classOutputDir = basePath + TARGET_COMPILATION_TESTS + i + "/classes";
sourceOutputDir = basePath + TARGET_COMPILATION_TESTS + i + "/generated-sources/mapping";
String testDependenciesDir = basePath + "/target/test-dependencies/";
classPath = new ArrayList<File>();
for ( String library : LIBRARIES ) {
classPath.add( new File( testDependenciesDir, library ) );
}
createOutputDirs();
( (ModifiableURLClassLoader) Thread.currentThread().getContextClassLoader() ).addOutputDir( classOutputDir );
}
private static List<File> buildCompilerClasspath() {
String[] bootClasspath =
System.getProperty( "java.class.path" ).split( System.getProperty( "path.separator" ) );
String fs = System.getProperty( "file.separator" );
String testClasses = "target" + fs + "test-classes";
String[] whitelist =
new String[] {
"processor" + fs + "target", // the processor itself
"core" + fs + "target", // MapStruct annotations in multi-module reactor build or IDE
"org" + fs + "mapstruct" + fs + "mapstruct" + fs, // MapStruct annotations in single module build
"freemarker",
"guava",
"javax.inject",
"spring-beans",
"spring-context",
"joda-time" };
List<File> classpath = new ArrayList<File>();
for ( String path : bootClasspath ) {
if ( !path.contains( testClasses ) && isWhitelisted( path, whitelist ) ) {
classpath.add( new File( path ) );
}
}
return classpath;
}
private static boolean isWhitelisted(String path, String[] whitelist) {
for ( String whitelisted : whitelist ) {
if ( path.contains( whitelisted ) ) {
return true;
}
}
return false;
}
protected void generateMapperImplementation() throws Exception {
CompilationResultHolder compilationResult = compile();
@ -380,7 +404,7 @@ class CompilingStatement extends Statement {
fileManager.getJavaFileObjectsFromFiles( getSourceFiles( compilationRequest.sourceClasses ) );
try {
fileManager.setLocation( StandardLocation.CLASS_PATH, classPath );
fileManager.setLocation( StandardLocation.CLASS_PATH, COMPILER_CLASSPATH );
fileManager.setLocation( StandardLocation.CLASS_OUTPUT, Arrays.asList( new File( classOutputDir ) ) );
fileManager.setLocation( StandardLocation.SOURCE_OUTPUT, Arrays.asList( new File( sourceOutputDir ) ) );
}

View File

@ -56,9 +56,6 @@ public class ModifiableURLClassLoader extends URLClassLoader {
}
}
/**
* @param basePath
*/
public void addURL(String basePath) {
try {
addURL( new URL( basePath ) );