fourlastor-alexandria / construo

A gradle plugin to cross compile jvm projects
MIT License
16 stars 1 forks source link

error during packaging on windows with anottationProcessors #52

Closed jeltedeproft closed 4 months ago

jeltedeproft commented 4 months ago

This was already discussed on the libgdx discord, but I am making a ticket to keep track of it. When you have a dependency like the following

annotationProcessor "org.projectlombok:lombok:$lombokVersion"

Then the createRuntimeImageWinX64 (haven't tested for different OS) will fail with the following error message on windows

Caching disabled for task ':lwjgl3:createRuntimeImageWinX64' because:
  Build cache is disabled
  Caching has not been enabled for the task
Task ':lwjgl3:createRuntimeImageWinX64' is not up-to-date because:
  Task has failed previously.
Starting process 'command 'C:\Program Files\Eclipse Adoptium\jdk-17.0.6.10-hotspot\bin\jdeps.exe''. Working directory: C:\Program Files\Eclipse Adoptium\jdk-17.0.6.10-hotspot Command: C:\Program Files\Eclipse Adoptium\jdk-17.0.6.10-hotspot\bin\jdeps.exe --ignore-missing-deps --list-deps C:\Users\Admin\Documents\GitHub\TowerOfLife\TowerOfLife\TowerOfLife\TowerOfLife\lwjgl3\build\lib\TowerOfLife-1.0.0.jar
Successfully started process 'command 'C:\Program Files\Eclipse Adoptium\jdk-17.0.6.10-hotspot\bin\jdeps.exe''
Starting process 'command 'C:\Program Files\Eclipse Adoptium\jdk-17.0.6.10-hotspot\bin\jlink.exe''. Working directory: C:\Users\Admin\Documents\GitHub\TowerOfLife\TowerOfLife\TowerOfLife\TowerOfLife\lwjgl3 Command: C:\Program Files\Eclipse Adoptium\jdk-17.0.6.10-hotspot\bin\jlink.exe --no-header-files --strip-native-commands --no-man-pages --compress=1 --strip-debug --add-modules JDK removed internal API/com.sun.tools.javac.processing,JDK removed internal API/com.sun.tools.javac.util,java.base,java.compiler,java.instrument,jdk.unsupported, --module-path C:\Users\Admin\Documents\GitHub\TowerOfLife\TowerOfLife\TowerOfLife\TowerOfLife\lwjgl3\build\construo\jdk\winX64\jdk-17.0.11+9\jmods --output C:\Users\Admin\Documents\GitHub\TowerOfLife\TowerOfLife\TowerOfLife\TowerOfLife\lwjgl3\build\construo\runtime-image\lwjgl3-winX64
Successfully started process 'command 'C:\Program Files\Eclipse Adoptium\jdk-17.0.6.10-hotspot\bin\jlink.exe''
Error: Module JDK removed internal API/com.sun.tools.javac.util not found
java.lang.module.FindException: Module JDK removed internal API/com.sun.tools.javac.util not found
        at java.base/java.lang.module.Resolver.findFail(Resolver.java:893)
        at java.base/java.lang.module.Resolver.resolve(Resolver.java:129)
        at java.base/java.lang.module.Configuration.resolve(Configuration.java:421)
        at java.base/java.lang.module.Configuration.resolve(Configuration.java:255)
        at jdk.jlink/jdk.tools.jlink.internal.Jlink$JlinkConfiguration.resolve(Jlink.java:217)
        at jdk.jlink/jdk.tools.jlink.internal.JlinkTask.createImageProvider(JlinkTask.java:536)
        at jdk.jlink/jdk.tools.jlink.internal.JlinkTask.createImage(JlinkTask.java:424)
        at jdk.jlink/jdk.tools.jlink.internal.JlinkTask.run(JlinkTask.java:276)
        at jdk.jlink/jdk.tools.jlink.internal.Main.run(Main.java:55)
        at jdk.jlink/jdk.tools.jlink.internal.Main.main(Main.java:33)

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':lwjgl3:createRuntimeImageWinX64'.
> Process 'command 'C:\Program Files\Eclipse Adoptium\jdk-17.0.6.10-hotspot\bin\jlink.exe'' finished with non-zero exit value 1

longer stack trace :

        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.lambda$executeIfValid$1(ExecuteActionsTaskExecuter.java:130)
        at org.gradle.internal.Try$Failure.ifSuccessfulOrElse(Try.java:282)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:128)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:116)
        at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
        at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51)
        at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
        at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:74)
        at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:200)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:195)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
        at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:42)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:331)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:318)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.lambda$execute$0(DefaultTaskExecutionGraph.java:314)
        at org.gradle.internal.operations.CurrentBuildOperationRef.with(CurrentBuildOperationRef.java:80)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:314)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:303)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:463)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:380)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
        at org.gradle.internal.concurrent.AbstractManagedExecutor$1.run(AbstractManagedExecutor.java:47)
Caused by: org.gradle.process.internal.ExecException: Process 'command 'C:\Program Files\Eclipse Adoptium\jdk-17.0.6.10-hotspot\bin\jlink.exe'' finished with non-zero exit value 1
        at org.gradle.process.internal.DefaultExecHandle$ExecResultImpl.assertNormalExitValue(DefaultExecHandle.java:442)
        at org.gradle.process.internal.DefaultExecAction.execute(DefaultExecAction.java:38)
        at org.gradle.process.internal.DefaultExecActionFactory.exec(DefaultExecActionFactory.java:202)
        at org.gradle.process.internal.DefaultExecOperations.exec(DefaultExecOperations.java:37)
        at io.github.fourlastor.construo.task.jvm.CreateRuntimeImageTask.run(CreateRuntimeImageTask.kt:51)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:125)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.doExecute(StandardTaskAction.java:58)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:51)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:29)
        at org.gradle.api.internal.tasks.execution.TaskExecution$3.run(TaskExecution.java:244)

I have tried to use the following command

gradlew -Dorg.gradle.jvmargs="--add-exports jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED" createRuntimeImageWinX64

But that also didn't work.

I did this with java 17, i tried with a lower java version but then it complained that construo requires java 17. Also didn't work with java 21

tommyettinger commented 4 months ago

Something about the process it's starting looks wrong. I've added newlines after so it's more readable, but the original line is:

Starting process 'command 'C:\Program Files\Eclipse Adoptium\jdk-17.0.6.10-hotspot\bin\jlink.exe''. Working directory: C:\Users\Admin\Documents\GitHub\TowerOfLife\TowerOfLife\TowerOfLife\TowerOfLife\lwjgl3 Command: C:\Program Files\Eclipse Adoptium\jdk-17.0.6.10-hotspot\bin\jlink.exe --no-header-files --strip-native-commands --no-man-pages --compress=1 --strip-debug --add-modules JDK removed internal API/com.sun.tools.javac.processing,JDK removed internal API/com.sun.tools.javac.util,java.base,java.compiler,java.instrument,jdk.unsupported, --module-path C:\Users\Admin\Documents\GitHub\TowerOfLife\TowerOfLife\TowerOfLife\TowerOfLife\lwjgl3\build\construo\jdk\winX64\jdk-17.0.11+9\jmods --output C:\Users\Admin\Documents\GitHub\TowerOfLife\TowerOfLife\TowerOfLife\TowerOfLife\lwjgl3\build\construo\runtime-image\lwjgl3-winX64

Starting process 'command 'C:\Program Files\Eclipse Adoptium\jdk-17.0.6.10-hotspot\bin\jlink.exe''. Working directory: 
C:\Users\Admin\Documents\GitHub\TowerOfLife\TowerOfLife\TowerOfLife\TowerOfLife\lwjgl3 Command: C:\Program Files\Eclipse Adoptium\jdk-17.0.6.10-hotspot\bin\jlink.exe 
--no-header-files --strip-native-commands --no-man-pages --compress=1 --strip-debug 
--add-modules JDK removed internal API/com.sun.tools.javac.processing,JDK removed internal API/com.sun.tools.javac.util,java.base,java.compiler,java.instrument,jdk.unsupported, 
--module-path C:\Users\Admin\Documents\GitHub\TowerOfLife\TowerOfLife\TowerOfLife\TowerOfLife\lwjgl3\build\construo\jdk\winX64\jdk-17.0.11+9\jmods 
--output C:\Users\Admin\Documents\GitHub\TowerOfLife\TowerOfLife\TowerOfLife\TowerOfLife\lwjgl3\build\construo\runtime-image\lwjgl3-winX64

In particular, the --add-modules part looks seriously wrong. I'm not sure if this could have been on the user-side at all, it looks construo-internal to me.

jeltedeproft commented 4 months ago

if I look at the code a bit, it seems this command is being created inside of CreateRuntimeImageTask.kt. More specifically in the following line the argument for --add-modules is being created

val modulesList = (modules.get() + guessModulesFromJar(javaHome)).distinct()

private fun guessModulesFromJar(javaHome: File): List<String> = ByteArrayOutputStream().use {
    execOperations.exec {
        setWorkingDir(jdkRoot)
        standardOutput = it
        commandLine(
            File(javaHome, executableForOs("bin/jdeps")).absolutePath,
            "--ignore-missing-deps",
            "--list-deps",
            jarFile.get().asFile.absolutePath
        )
    }
    it.toByteArray().toString(Charset.defaultCharset())
}.splitToSequence("\n").map { it.trim() }.toList()
jeltedeproft commented 4 months ago

Perhaps there needs to be some additional logic to handle invalid module names gracefully

fourlastor commented 4 months ago

Resolved offline: we found out the issue was lombok being declared as a dependency instead of compileOnly, changing the declaration to compileOnly fixed the issue