Hello all,

I ran into an issue while building OpenJFX 17u on Linux. The build failed for me with: "Entry swt-debug.jar is a duplicate but no duplicate handling strategy has been set"

I usually work with Eclipse, but I switched to VS Code for my current task. It appears that in my local setup, VS Code / Java / Gradle tooling pulled not only the SWT binary jar into the Gradle cache, but also the corresponding '-javadoc.jar' (org.eclipse.swt.gtk.linux.x86_64_3.105.3.v20170228-0512-.jar and org.eclipse.swt.gtk.linux.x86_64_3.105.3.v20170228-0512--javadoc.jar).

Both files matched the include pattern from the Gradle build file and were renamed to the same target name (swt-debug.jar), which then caused the duplicate entry failure after a clean build.

I analyzed this with ChatGPT/Codex, and it suggested the change below to the Gradle build file. Even though the problem was likely due to my local tooling / IDE setup rather than the normal OpenJFX build, this change still seems more robust than the current Gradle logic, since it selects the actual SWT binary jar directly instead of matching any '*swt*.jar' file in the cache directory.

Maybe someone with more expertise with the build-system can comment on whether this is a reasonable fix.

Note: this change is for the 17u branch, but master still looks similar: https://github.com/openjdk/jfx/blob/master/build.gradle#L3168-L3170

diff --git a/build.gradle b/build.gradle
index 13d6e0129c..f9cd3057d9 100644
--- a/build.gradle
+++ b/build.gradle
@@ -2694,17 +2694,19 @@ project(":swt") {
             // Skip copy if file is present.
             if (swtLib.exists()) return;

-            for (File f : configurations.compileClasspath.files) {
-                // Have to rename the swt jar because it is some platform specific name but -                // for the sake of the IDEs we need to have a single stable name that works
-                // on every platform
-                copy {
-                    into libsDir
-                    from f.getParentFile()
-                    include "**/*swt*.jar"
-                    includeEmptyDirs = false
-                    rename ".*swt.*jar", "swt-debug\\.jar"
-                }
+            File swtBinary = configurations.compileClasspath.files.find {
+                it.name == "${SWT_FILE_NAME}-.jar"
+            }
+            if (swtBinary == null) {
+                throw new GradleException("Unable to locate SWT binary jar ${SWT_FILE_NAME}-.jar on the compile classpath")
+            }
+
+            // Copy exactly the SWT binary jar. Its cache directory can also contain +            // javadocs, which would otherwise be renamed to the same target name.
+            copy {
+                into libsDir
+                from swtBinary
+                rename { "swt-debug.jar" }
             }
         }
     }


Greetings, Thorsten

Reply via email to