spoon icon indicating copy to clipboard operation
spoon copied to clipboard

Compilation error with JDK 11

Open magg opened this issue 2 years ago • 3 comments

Hello I am trying to upgrade an old project that used Spoon 5.9.0 to Spoon 10.1.0 and upgrade the JDK from 8 to 11.

Does Spoon work with a compliance level set to 11 if I want the compiler to work with JDK 11

Here's my code

    public void compileCode(Set<Path> sources, Set<Path> classpath, Path output) {
        if (log.isDebugEnabled()) {
            log.debug("Compiling code with spoon. Source folders: [{}]; output folder: {}; classpath: [{}]",
                    sources.stream().map(Path::toString).collect(joining(", ")),
                    output.toString(),
                    classpath.stream().map(Path::toString).collect(joining(", ")));
        }

        final SpoonModelBuilder compiler = new Launcher().createCompiler();
        sources.forEach(dir -> compiler.addInputSource(dir.toFile()));
        compiler.setBinaryOutputDirectory(output.toFile());
        compiler.setSourceClasspath(classpath.stream().map(Path::toString).toArray(String[]::new));
        compiler.getFactory().getEnvironment().setComplianceLevel(JAVA_VERSION);
        compiler.compile(InputType.FILES);
        checkCompilationSuccess(compiler);

        log.debug("Compilation with spoon is completed successfully.");
    }

    private void checkCompilationSuccess(SpoonModelBuilder compiler) {
        int errorCount = compiler.getFactory().getEnvironment().getErrorCount();
        if (errorCount != 0) {
            throw new CompilationException(
                    "Environment of spoon compiler has " + errorCount + " errors."
                            + " Source folders was " + compiler.getInputSources() + "."
                            + " Sources classpath was " + Arrays.toString(compiler.getSourceClasspath())
            );
        }
    }

But I get this error if JAVA_VERSION is set to 11, it works if I put 8

spoon.support.compiler.SnippetCompilationError: The type java.lang.String cannot be resolved. It is indirectly referenced from required .class files at /tmp/junit145769342327212861/c5149660-9619-4e7e-a660-4768bd0c399a/sources/com/magg/psa/dex/auth/core/ui/pages/core/DynamicPage.java:1

	at spoon.support.compiler.jdt.JDTBasedSpoonCompiler.reportProblemsWhenCompiling(JDTBasedSpoonCompiler.java:613)
	at spoon.support.compiler.jdt.JDTBasedSpoonCompiler.compile(JDTBasedSpoonCompiler.java:168)
	at com.magg.pss.routine.service.compile.SpoonCompilationService.compileCode(SpoonCompilationService.java:41)
	at com.magg.pss.routine.service.compile.SpoonCompilationServiceTest.compileCode(SpoonCompilationServiceTest.java:46)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
	at org.mockito.internal.runners.DefaultInternalRunner$1$1.evaluate(DefaultInternalRunner.java:46)
	at org.junit.rules.ExternalResource$1.evaluate(ExternalResource.java:54)
	at org.junit.rules.ExpectedException$ExpectedExceptionStatement.evaluate(ExpectedException.java:258)
	at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
	at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:100)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:103)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:63)
	at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)
	at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)
	at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:413)
	at org.mockito.internal.runners.DefaultInternalRunner$1.run(DefaultInternalRunner.java:77)
	at org.mockito.internal.runners.DefaultInternalRunner.run(DefaultInternalRunner.java:83)
	at org.mockito.internal.runners.StrictRunner.run(StrictRunner.java:39)
	at org.mockito.junit.MockitoJUnitRunner.run(MockitoJUnitRunner.java:163)
	at org.mockito.runners.MockitoJUnitRunner.run(MockitoJUnitRunner.java:54)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)
	at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38)
	at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11)
	at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35)
	at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:235)
	at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54)

magg avatar Jul 08 '22 16:07 magg

This issue is caused by JDT. I looked around a bit, and found this explanation. I'm not sure if that's the same issue you're facing, but maybe the direction helps to identify what's going wrong.

SirYwell avatar Jul 09 '22 08:07 SirYwell

Isn't this related to PR https://github.com/INRIA/spoon/pull/4751 since it seems Spoon does not implement Java Modules completely.

I would like to be able to set dependency jars in the modulepath and not the classpath, in order to compile a java project with external library JAR dependencies. The project and the libraries lack the module-info.java files

It seems currently I would need to have a project and all its JAR dependencies with a module-info.java

magg avatar Jul 12 '22 05:07 magg

Maybe, however that is mostly about runtime reflections and shouldn't affect JDT.

The missing support for module path sounds like a different problem, but from my understanding it would be more restrictive when it comes to overlapping packages. So if you're issue is caused by overlapping packages as indicated by the problem I linked, that wouldn't help you.

Without seeing your actual setup and the files and packages you're adding to the classpath, it's hard to say much more about it.

SirYwell avatar Jul 12 '22 06:07 SirYwell

Closing this issue because stale. Please have no hesitation to reopen it.

MartinWitt avatar Nov 07 '22 08:11 MartinWitt