Search code examples
javaimportpackagejava-compiler-api

Java Compiler API: import of custom package not working


I am working on a web project where I create a custom .java-File, load it with a custom ClassLoader, compile it using the Compiler API and then execute it via Reflection. The only thing that doesn't seem to work is compiling the file which looks like that:

package testfiles; 
import exceptions.IncorrectSolutionException; 
public class TestFile { 
  public static void testSolution() throws IncorrectSolutionException {
    //some code here
  }
}

Using the Diagnostic-Collector of the Compiler-API, I get the following error-message:

package exceptions does not exist, line 2 cannot find symbol
symbol:   class IncorrectSolutionException

The package 'exceptions' and the referred class definitely exist and my src-folder is structured like that: (folder with class files as well)

  • src
    • exceptions
    • testfiles

I tried setting the classpath as suggested here but it doesn't change anything.

How I compile the file:

DiagnosticCollector< JavaFileObject > diagnostics = new DiagnosticCollector<>();
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager fileManager = compiler.getStandardFileManager(diagnostics, null, null);
CompilationTask task = compiler.getTask(null, fileManager, diagnostics, optionList, null, files);
File file = new File(absolute path);
//I am using the absolute path here, because I had problems resolving the relative path as my working directory seems to be the folder eclipse is installed in.
Iterable<? extends JavaFileObject> files = fileManager.getJavaFileObjectsFromFiles(Arrays.asList(file));
if(task.call()) {
    System.out.println("compiling File");
} else {
    //...handle Diagnostics
}

Do I have to add another option to the CompilationTask or is the problem somewhere else? Thanks in advance!


Solution

  • Apparently it had to do something with the working directory and the folder Tomcat was launched in. Configuring the Server Path under Server Location did the trick for me (Set it to the project root in my workspace).