From 815892eaa1c28d5cd2a40ab7e73cfc681ec4f256 Mon Sep 17 00:00:00 2001 From: arlaneenalra Date: Sat, 28 May 2022 13:10:49 -0500 Subject: [PATCH 1/2] Add smoketest that will work on M1 with newer gradle. --- build.gradle | 19 +- gradle/wrapper/gradle-wrapper.properties | 3 +- settings.gradle | 4 + .../java/org/openjfx/gradle/JavaFXPlugin.java | 2 + .../org/openjfx/gradle/tasks/ExecTask.java | 90 ++----- .../org/openjfx/gradle/tasks/JavaFXTask.java | 242 ++++++++++++++++++ .../gradle/tasks/StartScriptsTask.java | 81 ++++++ .../org.openjfx.javafxplugin.properties | 31 --- .../openjfx/gradle/JavaFXPluginSmokeTest.java | 17 +- .../gradle-6.0.1}/build.gradle | 0 .../gradle-6.0.1}/modular/build.gradle | 0 .../modular/src/main/java/module-info.java | 0 .../org/openjfx/gradle/javafx/test/Main.java | 0 .../gradle-6.0.1}/non-modular/build.gradle | 0 .../org/openjfx/gradle/javafx/test/Main.java | 0 .../gradle-6.0.1}/settings.gradle | 0 .../gradle-6.0.1}/transitive/build.gradle | 0 .../org/openjfx/gradle/javafx/test/Main.java | 0 test-projects/gradle-7.4.2/build.gradle | 25 ++ .../gradle-7.4.2/modular/build.gradle | 9 + .../modular/src/main/java/module-info.java | 5 + .../org/openjfx/gradle/javafx/test/Main.java | 30 +++ .../gradle-7.4.2/non-modular/build.gradle | 6 + .../org/openjfx/gradle/javafx/test/Main.java | 30 +++ test-projects/gradle-7.4.2/settings.gradle | 5 + .../gradle-7.4.2/transitive/build.gradle | 11 + .../org/openjfx/gradle/javafx/test/Main.java | 30 +++ 27 files changed, 531 insertions(+), 109 deletions(-) create mode 100644 src/main/java/org/openjfx/gradle/tasks/JavaFXTask.java create mode 100644 src/main/java/org/openjfx/gradle/tasks/StartScriptsTask.java delete mode 100644 src/main/resources/META-INF/gradle-plugins/org.openjfx.javafxplugin.properties rename {test-project => test-projects/gradle-6.0.1}/build.gradle (100%) rename {test-project => test-projects/gradle-6.0.1}/modular/build.gradle (100%) rename {test-project => test-projects/gradle-6.0.1}/modular/src/main/java/module-info.java (100%) rename {test-project => test-projects/gradle-6.0.1}/modular/src/main/java/org/openjfx/gradle/javafx/test/Main.java (100%) rename {test-project => test-projects/gradle-6.0.1}/non-modular/build.gradle (100%) rename {test-project => test-projects/gradle-6.0.1}/non-modular/src/main/java/org/openjfx/gradle/javafx/test/Main.java (100%) rename {test-project => test-projects/gradle-6.0.1}/settings.gradle (100%) rename {test-project => test-projects/gradle-6.0.1}/transitive/build.gradle (100%) rename {test-project => test-projects/gradle-6.0.1}/transitive/src/main/java/org/openjfx/gradle/javafx/test/Main.java (100%) create mode 100644 test-projects/gradle-7.4.2/build.gradle create mode 100644 test-projects/gradle-7.4.2/modular/build.gradle create mode 100644 test-projects/gradle-7.4.2/modular/src/main/java/module-info.java create mode 100644 test-projects/gradle-7.4.2/modular/src/main/java/org/openjfx/gradle/javafx/test/Main.java create mode 100644 test-projects/gradle-7.4.2/non-modular/build.gradle create mode 100644 test-projects/gradle-7.4.2/non-modular/src/main/java/org/openjfx/gradle/javafx/test/Main.java create mode 100644 test-projects/gradle-7.4.2/settings.gradle create mode 100644 test-projects/gradle-7.4.2/transitive/build.gradle create mode 100644 test-projects/gradle-7.4.2/transitive/src/main/java/org/openjfx/gradle/javafx/test/Main.java diff --git a/build.gradle b/build.gradle index 772717a..68a6369 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,6 @@ plugins { - id 'com.gradle.build-scan' version '2.1' id 'java-gradle-plugin' - id 'com.github.hierynomus.license' version '0.15.0' + id 'com.github.hierynomus.license' version '0.16.1' id 'com.gradle.plugin-publish' version '0.12.0' id 'com.github.ben-manes.versions' version '0.20.0' id 'maven-publish' @@ -37,7 +36,21 @@ dependencies { } test { - useJUnitPlatform() + var os = org.gradle.nativeplatform.platform.internal.DefaultNativePlatform.currentOperatingSystem; + + // At least in some cases this can mis-report arm-v8 and not arm. + var rawArch = org.gradle.nativeplatform.platform.internal.DefaultNativePlatform.currentArchitecture.displayName; + var normalizedArch = rawArch.toLowerCase() + + if (os.isMacOsX() && (normalizedArch.contains("arm") || normalizedArch.contains("aarch"))) { + println("Detected M1") + useJUnitPlatform { + excludeTags "failsOnM1" + } + } else { + println("Not on M1") + useJUnitPlatform() + } } gradlePlugin { diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 4731649..e4ae44e 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip +#distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-all.zip diff --git a/settings.gradle b/settings.gradle index 49bca9e..fb47f8b 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1,5 @@ +plugins { + id "com.gradle.enterprise" version "3.10.1" +} + rootProject.name = 'javafx-plugin' diff --git a/src/main/java/org/openjfx/gradle/JavaFXPlugin.java b/src/main/java/org/openjfx/gradle/JavaFXPlugin.java index 2b5e59d..3d1cc89 100644 --- a/src/main/java/org/openjfx/gradle/JavaFXPlugin.java +++ b/src/main/java/org/openjfx/gradle/JavaFXPlugin.java @@ -34,6 +34,7 @@ import org.gradle.api.Project; import org.javamodularity.moduleplugin.ModuleSystemPlugin; import org.openjfx.gradle.tasks.ExecTask; +import org.openjfx.gradle.tasks.StartScriptsTask; public class JavaFXPlugin implements Plugin { @@ -45,5 +46,6 @@ public void apply(Project project) { project.getExtensions().create("javafx", JavaFXOptions.class, project); project.getTasks().create("configJavafxRun", ExecTask.class, project); + project.getTasks().create("configJavafxStartScripts", StartScriptsTask.class, project); } } diff --git a/src/main/java/org/openjfx/gradle/tasks/ExecTask.java b/src/main/java/org/openjfx/gradle/tasks/ExecTask.java index 6b31f84..37e5d97 100644 --- a/src/main/java/org/openjfx/gradle/tasks/ExecTask.java +++ b/src/main/java/org/openjfx/gradle/tasks/ExecTask.java @@ -29,96 +29,40 @@ */ package org.openjfx.gradle.tasks; -import org.gradle.api.DefaultTask; -import org.gradle.api.GradleException; import org.gradle.api.Project; import org.gradle.api.file.FileCollection; import org.gradle.api.logging.Logger; import org.gradle.api.logging.Logging; -import org.gradle.api.plugins.ApplicationPlugin; -import org.gradle.api.tasks.JavaExec; -import org.gradle.api.tasks.TaskAction; -import org.javamodularity.moduleplugin.extensions.RunModuleOptions; -import org.openjfx.gradle.JavaFXModule; -import org.openjfx.gradle.JavaFXOptions; -import org.openjfx.gradle.JavaFXPlatform; import javax.inject.Inject; -import java.io.File; -import java.util.ArrayList; -import java.util.Arrays; import java.util.List; -import java.util.TreeSet; -public class ExecTask extends DefaultTask { +public class ExecTask extends JavaFXTask { private static final Logger LOGGER = Logging.getLogger(ExecTask.class); - private final Project project; - private JavaExec execTask; - @Inject - public ExecTask(Project project) { - this.project = project; - project.getPluginManager().withPlugin(ApplicationPlugin.APPLICATION_PLUGIN_NAME, e -> { - execTask = (JavaExec) project.getTasks().findByName(ApplicationPlugin.TASK_RUN_NAME); - if (execTask != null) { - execTask.dependsOn(this); - } else { - throw new GradleException("Run task not found."); - } - }); + public ExecTask(final Project project) { + super(project); } - @TaskAction - public void action() { - if (execTask != null) { - JavaFXOptions javaFXOptions = project.getExtensions().getByType(JavaFXOptions.class); - JavaFXModule.validateModules(javaFXOptions.getModules()); - - var definedJavaFXModuleNames = new TreeSet<>(javaFXOptions.getModules()); - if (!definedJavaFXModuleNames.isEmpty()) { - RunModuleOptions moduleOptions = execTask.getExtensions().findByType(RunModuleOptions.class); - - final FileCollection classpathWithoutJavaFXJars = execTask.getClasspath().filter( - jar -> Arrays.stream(JavaFXModule.values()).noneMatch(javaFXModule -> jar.getName().contains(javaFXModule.getArtifactName())) - ); - final FileCollection javaFXPlatformJars = execTask.getClasspath().filter(jar -> isJavaFXJar(jar, javaFXOptions.getPlatform())); - - if (moduleOptions != null) { - LOGGER.info("Modular JavaFX application found"); - // Remove empty JavaFX jars from classpath - execTask.setClasspath(classpathWithoutJavaFXJars.plus(javaFXPlatformJars)); - definedJavaFXModuleNames.forEach(javaFXModule -> moduleOptions.getAddModules().add(javaFXModule)); - } else { - LOGGER.info("Non-modular JavaFX application found"); - // Remove all JavaFX jars from classpath - execTask.setClasspath(classpathWithoutJavaFXJars); - - var javaFXModuleJvmArgs = List.of("--module-path", javaFXPlatformJars.getAsPath()); - - var jvmArgs = new ArrayList(); - jvmArgs.add("--add-modules"); - jvmArgs.add(String.join(",", definedJavaFXModuleNames)); + @Override + public FileCollection getClasspath() { + return getExecTask().getClasspath(); + } - List execJvmArgs = execTask.getJvmArgs(); - if (execJvmArgs != null) { - jvmArgs.addAll(execJvmArgs); - } - jvmArgs.addAll(javaFXModuleJvmArgs); + @Override + public void setTargetClasspath(FileCollection classpath) { + getExecTask().setClasspath(classpath); + } - execTask.setJvmArgs(jvmArgs); - } - } - } else { - throw new GradleException("Run task not found. Please, make sure the Application plugin is applied"); - } + @Override + public void setTargetJvmArgs(List jvmArgs) { + getExecTask().setJvmArgs(jvmArgs); } - private static boolean isJavaFXJar(File jar, JavaFXPlatform platform) { - return jar.isFile() && - Arrays.stream(JavaFXModule.values()).anyMatch(javaFXModule -> - javaFXModule.compareJarFileName(platform, jar.getName()) || - javaFXModule.getModuleJarFileName().equals(jar.getName())); + @Override + public List getTargetJvmArgs() { + return getExecTask().getJvmArgs(); } } diff --git a/src/main/java/org/openjfx/gradle/tasks/JavaFXTask.java b/src/main/java/org/openjfx/gradle/tasks/JavaFXTask.java new file mode 100644 index 0000000..4357d9f --- /dev/null +++ b/src/main/java/org/openjfx/gradle/tasks/JavaFXTask.java @@ -0,0 +1,242 @@ +/* + * Copyright (c) 2018, Gluon + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * * Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.openjfx.gradle.tasks; + +import org.gradle.api.DefaultTask; +import org.gradle.api.GradleException; +import org.gradle.api.Project; +import org.gradle.api.file.FileCollection; +import org.gradle.api.logging.Logger; +import org.gradle.api.logging.Logging; +import org.gradle.api.plugins.ApplicationPlugin; +import org.gradle.api.tasks.*; +import org.javamodularity.moduleplugin.extensions.RunModuleOptions; +import org.openjfx.gradle.JavaFXModule; +import org.openjfx.gradle.JavaFXOptions; +import org.openjfx.gradle.JavaFXPlatform; + +import javax.inject.Inject; +import java.io.File; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Set; + +public abstract class JavaFXTask extends DefaultTask { + + private static final Logger LOGGER = Logging.getLogger(JavaFXTask.class); + + private JavaFXOptions options = null; + + protected final Project project; + + private JavaExec execTask; + @Inject + public JavaFXTask(final Project project) { + this.project = project; + + project.getPluginManager().withPlugin(ApplicationPlugin.APPLICATION_PLUGIN_NAME, e -> { + execTask = (JavaExec) project.getTasks().findByName(ApplicationPlugin.TASK_RUN_NAME); + + if (execTask == null) { + throw new GradleException("Run task not found."); + } + + execTask.dependsOn(this); + }); + } + + /** + * Retrieve and validate the JavaFXOptions instance for this task. + * + * @return JavaFXOptions instance + */ + @Internal + public JavaFXOptions getJavaFXOptions() { + if (options == null) { + options = project.getExtensions().getByType(JavaFXOptions.class); + JavaFXModule.validateModules(options.getModules()); + } + + return options; + } + + /** + * Returns a set of the defined modules for this task. + * + * @return Set of requested JavaFX modules + */ + @Internal + public Set getModules() { + return Set.copyOf(getJavaFXOptions().getModules()); + } + + /** + * Filters out any JavaFX jars from the passed in FileCollection. + * + * @param classpath The classpath to filter. + * + * @return FileCollection containing non-JavaFX jars + */ + public FileCollection removeJavaFXJars(final FileCollection classpath) { + return classpath.filter( + jar -> Arrays.stream(JavaFXModule.values()).noneMatch( + javaFXModule -> jar.getName().contains(javaFXModule.getArtifactName()) + ) + ); + } + + /** + * Filters out anything that is not a JavaFX jar from the the passed in FileCollection. + * + * @param classpath The classpath to filter. + * + * @return FileCollection containing only JavaFX platform jars. + */ + public FileCollection onlyJavaFXPlatformJars(final FileCollection classpath) { + return classpath.filter(jar -> isJavaFXJar(jar, getJavaFXOptions().getPlatform())); + } + + /** + * Generates a classpath with the only the non-JavaFX and JavaFX platform jars. + * This is used whan configuration Modular JavaFX applications. + * + * @param classpath The classpath to filter. + * + * @return FileCollections with "empty" JavaFX jars removed but platform jars present. + */ + public FileCollection filterEmptyJavaFXJArs(final FileCollection classpath) { + return removeJavaFXJars(classpath).plus(onlyJavaFXPlatformJars(classpath)); + } + + /** + * Generate extra jvm options for non-modular java applications. + * + * @param classpath The classpath to use when generating jvm options. + * @param originalOpts Any options that need to be retained from the original configuration. + * + * @return List of jvm arguments + */ + public List buildNonModularJvmOptions(final FileCollection classpath, final List originalOpts) { + var javaFXModuleJvmArgs = List.of("--module-path", onlyJavaFXPlatformJars(classpath).getAsPath()); + + var jvmArgs = new ArrayList(); + jvmArgs.add("--add-modules"); + jvmArgs.add(String.join(",", getModules())); + + if (originalOpts != null) { + jvmArgs.addAll(originalOpts); + } + jvmArgs.addAll(javaFXModuleJvmArgs); + + return jvmArgs; + } + + static boolean isJavaFXJar(final File jar, final JavaFXPlatform platform) { + return jar.isFile() && + Arrays.stream(JavaFXModule.values()).anyMatch(javaFXModule -> + javaFXModule.compareJarFileName(platform, jar.getName()) || + javaFXModule.getModuleJarFileName().equals(jar.getName())); + } + + /** + * Retrieves a configured JavaExec task instance. This is requried for pretty much all subclasses. If no JavaExec + * task is found, throw an exception. + * + * @return JavaExec task + */ + @Internal + public JavaExec getExecTask() { + if (execTask == null) { + throw new GradleException("Run task not found. Please, make sure the Application plugin is applied"); + } + return execTask; + } + + @TaskAction + public void action() { + final JavaExec execTask = getExecTask(); + + final Set definedJavaFXModuleNames = getModules(); + if (definedJavaFXModuleNames.isEmpty()) { + // If definedJavaFXModuleNames is empty, there is nothing for this code to do. + return; + } + + final RunModuleOptions moduleOptions = execTask.getExtensions().findByType(RunModuleOptions.class); + final FileCollection originalClasspath = getClasspath(); + + if (moduleOptions != null) { + LOGGER.info("Modular JavaFX application found"); + + // Remove empty JavaFX jars from classpath + setTargetClasspath(filterEmptyJavaFXJArs(originalClasspath)); + definedJavaFXModuleNames.forEach(javaFXModule -> moduleOptions.getAddModules().add(javaFXModule)); + } else { + LOGGER.info("Non-modular JavaFX application found"); + + // Remove all JavaFX jars from classpath + setTargetClasspath(removeJavaFXJars(originalClasspath)); + setTargetJvmArgs(buildNonModularJvmOptions(originalClasspath, getTargetJvmArgs())); + } + } + + /** + * Implemented by subclasses to retrieve the original classpath before modification. + * + * @return FileCollection containing the original classpath. + */ + @Internal + abstract FileCollection getClasspath(); + + /** + * Implemented by subclasses to set classpath values on target task. + * + * @param classpath FileCollection to set as classpath. + */ + @Internal + public abstract void setTargetClasspath(final FileCollection classpath); + + /** + * Implemented by subclasses to set required JvmArgs on target task. + * + * @param jvmArgs List of Jvm arguments to set on target task. + */ + @Internal + public abstract void setTargetJvmArgs(final List jvmArgs); + + /** + * Returns the existing list of JvmArgs for the target task. + * + * @return List or previously configured Jvm arguments. + */ + @Internal + public abstract List getTargetJvmArgs(); +} diff --git a/src/main/java/org/openjfx/gradle/tasks/StartScriptsTask.java b/src/main/java/org/openjfx/gradle/tasks/StartScriptsTask.java new file mode 100644 index 0000000..08b1aeb --- /dev/null +++ b/src/main/java/org/openjfx/gradle/tasks/StartScriptsTask.java @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2018, Gluon + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * * Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package org.openjfx.gradle.tasks; + +import org.gradle.api.GradleException; +import org.gradle.api.Project; +import org.gradle.api.file.FileCollection; +import org.gradle.api.plugins.ApplicationPlugin; +import org.gradle.api.tasks.application.CreateStartScripts; + +import javax.inject.Inject; +import java.util.ArrayList; +import java.util.List; + +public class StartScriptsTask extends JavaFXTask { + + private CreateStartScripts startScripts; + + @Inject + public StartScriptsTask(Project project) { + super(project); + + project.getPluginManager().withPlugin(ApplicationPlugin.APPLICATION_PLUGIN_NAME, e -> { + startScripts = (CreateStartScripts) project.getTasks().findByName(ApplicationPlugin.TASK_START_SCRIPTS_NAME); + if (startScripts == null) { + throw new GradleException("StartScripts task not found."); + } + + startScripts.dependsOn(this); + }); + } + + @Override + public FileCollection getClasspath() { + return startScripts.getClasspath(); + } + + @Override + public void setTargetClasspath(FileCollection classpath) { + startScripts.setClasspath(classpath); + } + + @Override + public void setTargetJvmArgs(List jvmArgs) { + startScripts.setDefaultJvmOpts(jvmArgs); + } + + @Override + public List getTargetJvmArgs() { + final List args = new ArrayList<>(); + startScripts.getDefaultJvmOpts().forEach(args::add); + return args; + } +} diff --git a/src/main/resources/META-INF/gradle-plugins/org.openjfx.javafxplugin.properties b/src/main/resources/META-INF/gradle-plugins/org.openjfx.javafxplugin.properties deleted file mode 100644 index cc83c85..0000000 --- a/src/main/resources/META-INF/gradle-plugins/org.openjfx.javafxplugin.properties +++ /dev/null @@ -1,31 +0,0 @@ -# -# Copyright (c) 2018, Gluon -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# * Redistributions of source code must retain the above copyright notice, this -# list of conditions and the following disclaimer. -# -# * Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# * Neither the name of the copyright holder nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# - -implementation-class=org.openjfx.gradle.JavaFXPlugin diff --git a/src/test/java/org/openjfx/gradle/JavaFXPluginSmokeTest.java b/src/test/java/org/openjfx/gradle/JavaFXPluginSmokeTest.java index e58c07a..bc678d0 100644 --- a/src/test/java/org/openjfx/gradle/JavaFXPluginSmokeTest.java +++ b/src/test/java/org/openjfx/gradle/JavaFXPluginSmokeTest.java @@ -31,6 +31,7 @@ import org.gradle.testkit.runner.GradleRunner; import org.gradle.testkit.runner.TaskOutcome; +import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import java.io.File; @@ -40,9 +41,10 @@ class JavaFXPluginSmokeTest { @Test + @Tag("failsOnM1") void smokeTest() { var result = GradleRunner.create() - .withProjectDir(new File("test-project")) + .withProjectDir(new File("test-projects/gradle-6.0.1")) .withGradleVersion("6.0.1") .withArguments("clean", "build", "run", "--stacktrace") .forwardOutput() @@ -52,4 +54,17 @@ void smokeTest() { assertEquals(TaskOutcome.SUCCESS, result.task(":non-modular:run").getOutcome(), "Failed build!"); assertEquals(TaskOutcome.SUCCESS, result.task(":transitive:run").getOutcome(), "Failed build!"); } + @Test + void smokeTest7_4_2() { + var result = GradleRunner.create() + .withProjectDir(new File("test-projects/gradle-7.4.2")) + .withGradleVersion("7.4.2") + .withArguments("clean", "build", "run", "--stacktrace") + .forwardOutput() + .build(); + + assertEquals(TaskOutcome.SUCCESS, result.task(":modular:run").getOutcome(), "Failed build!"); + assertEquals(TaskOutcome.SUCCESS, result.task(":non-modular:run").getOutcome(), "Failed build!"); + assertEquals(TaskOutcome.SUCCESS, result.task(":transitive:run").getOutcome(), "Failed build!"); + } } diff --git a/test-project/build.gradle b/test-projects/gradle-6.0.1/build.gradle similarity index 100% rename from test-project/build.gradle rename to test-projects/gradle-6.0.1/build.gradle diff --git a/test-project/modular/build.gradle b/test-projects/gradle-6.0.1/modular/build.gradle similarity index 100% rename from test-project/modular/build.gradle rename to test-projects/gradle-6.0.1/modular/build.gradle diff --git a/test-project/modular/src/main/java/module-info.java b/test-projects/gradle-6.0.1/modular/src/main/java/module-info.java similarity index 100% rename from test-project/modular/src/main/java/module-info.java rename to test-projects/gradle-6.0.1/modular/src/main/java/module-info.java diff --git a/test-project/modular/src/main/java/org/openjfx/gradle/javafx/test/Main.java b/test-projects/gradle-6.0.1/modular/src/main/java/org/openjfx/gradle/javafx/test/Main.java similarity index 100% rename from test-project/modular/src/main/java/org/openjfx/gradle/javafx/test/Main.java rename to test-projects/gradle-6.0.1/modular/src/main/java/org/openjfx/gradle/javafx/test/Main.java diff --git a/test-project/non-modular/build.gradle b/test-projects/gradle-6.0.1/non-modular/build.gradle similarity index 100% rename from test-project/non-modular/build.gradle rename to test-projects/gradle-6.0.1/non-modular/build.gradle diff --git a/test-project/non-modular/src/main/java/org/openjfx/gradle/javafx/test/Main.java b/test-projects/gradle-6.0.1/non-modular/src/main/java/org/openjfx/gradle/javafx/test/Main.java similarity index 100% rename from test-project/non-modular/src/main/java/org/openjfx/gradle/javafx/test/Main.java rename to test-projects/gradle-6.0.1/non-modular/src/main/java/org/openjfx/gradle/javafx/test/Main.java diff --git a/test-project/settings.gradle b/test-projects/gradle-6.0.1/settings.gradle similarity index 100% rename from test-project/settings.gradle rename to test-projects/gradle-6.0.1/settings.gradle diff --git a/test-project/transitive/build.gradle b/test-projects/gradle-6.0.1/transitive/build.gradle similarity index 100% rename from test-project/transitive/build.gradle rename to test-projects/gradle-6.0.1/transitive/build.gradle diff --git a/test-project/transitive/src/main/java/org/openjfx/gradle/javafx/test/Main.java b/test-projects/gradle-6.0.1/transitive/src/main/java/org/openjfx/gradle/javafx/test/Main.java similarity index 100% rename from test-project/transitive/src/main/java/org/openjfx/gradle/javafx/test/Main.java rename to test-projects/gradle-6.0.1/transitive/src/main/java/org/openjfx/gradle/javafx/test/Main.java diff --git a/test-projects/gradle-7.4.2/build.gradle b/test-projects/gradle-7.4.2/build.gradle new file mode 100644 index 0000000..459ec63 --- /dev/null +++ b/test-projects/gradle-7.4.2/build.gradle @@ -0,0 +1,25 @@ +buildscript { + repositories { + maven { + url "https://plugins.gradle.org/m2/" + } + maven { + url 'https://oss.sonatype.org/content/repositories/snapshots/' + } + } + dependencies { + classpath "org.openjfx:javafx-plugin:0.0.+" + } +} + +subprojects { + apply plugin: 'application' + apply plugin: 'org.openjfx.javafxplugin' + + sourceCompatibility = 11 + targetCompatibility = 11 + + repositories { + mavenCentral() + } +} \ No newline at end of file diff --git a/test-projects/gradle-7.4.2/modular/build.gradle b/test-projects/gradle-7.4.2/modular/build.gradle new file mode 100644 index 0000000..143fb00 --- /dev/null +++ b/test-projects/gradle-7.4.2/modular/build.gradle @@ -0,0 +1,9 @@ +application { + mainClass = 'org.openjfx.gradle.javafx.test.Main' + mainModule = 'org.openjfx.gradle.javafx.test' +} + +javafx { + version = '18' + modules = ['javafx.controls'] +} diff --git a/test-projects/gradle-7.4.2/modular/src/main/java/module-info.java b/test-projects/gradle-7.4.2/modular/src/main/java/module-info.java new file mode 100644 index 0000000..7c06d5b --- /dev/null +++ b/test-projects/gradle-7.4.2/modular/src/main/java/module-info.java @@ -0,0 +1,5 @@ +module org.openjfx.gradle.javafx.test { + requires javafx.controls; + + exports org.openjfx.gradle.javafx.test; +} \ No newline at end of file diff --git a/test-projects/gradle-7.4.2/modular/src/main/java/org/openjfx/gradle/javafx/test/Main.java b/test-projects/gradle-7.4.2/modular/src/main/java/org/openjfx/gradle/javafx/test/Main.java new file mode 100644 index 0000000..cdeb22e --- /dev/null +++ b/test-projects/gradle-7.4.2/modular/src/main/java/org/openjfx/gradle/javafx/test/Main.java @@ -0,0 +1,30 @@ +package org.openjfx.gradle.javafx.test; + +import javafx.application.Application; +import javafx.scene.Scene; +import javafx.scene.control.Label; +import javafx.scene.layout.StackPane; +import javafx.stage.Stage; + +public class Main extends Application { + + @Override + public void start(Stage primaryStage) { + StackPane root = new StackPane(new Label("Hello World!")); + + Scene scene = new Scene(root, 800, 600); + + primaryStage.setScene(scene); + primaryStage.show(); + + new Thread(() -> { + try { + Thread.sleep(500); + } catch (InterruptedException e) { + throw new RuntimeException("Should not happen!"); + } + + System.exit(0); + }).start(); + } +} \ No newline at end of file diff --git a/test-projects/gradle-7.4.2/non-modular/build.gradle b/test-projects/gradle-7.4.2/non-modular/build.gradle new file mode 100644 index 0000000..a625773 --- /dev/null +++ b/test-projects/gradle-7.4.2/non-modular/build.gradle @@ -0,0 +1,6 @@ +mainClassName = 'org.openjfx.gradle.javafx.test.Main' + +javafx { + version = "18" + modules = [ 'javafx.controls', 'javafx.web' ] +} diff --git a/test-projects/gradle-7.4.2/non-modular/src/main/java/org/openjfx/gradle/javafx/test/Main.java b/test-projects/gradle-7.4.2/non-modular/src/main/java/org/openjfx/gradle/javafx/test/Main.java new file mode 100644 index 0000000..cdeb22e --- /dev/null +++ b/test-projects/gradle-7.4.2/non-modular/src/main/java/org/openjfx/gradle/javafx/test/Main.java @@ -0,0 +1,30 @@ +package org.openjfx.gradle.javafx.test; + +import javafx.application.Application; +import javafx.scene.Scene; +import javafx.scene.control.Label; +import javafx.scene.layout.StackPane; +import javafx.stage.Stage; + +public class Main extends Application { + + @Override + public void start(Stage primaryStage) { + StackPane root = new StackPane(new Label("Hello World!")); + + Scene scene = new Scene(root, 800, 600); + + primaryStage.setScene(scene); + primaryStage.show(); + + new Thread(() -> { + try { + Thread.sleep(500); + } catch (InterruptedException e) { + throw new RuntimeException("Should not happen!"); + } + + System.exit(0); + }).start(); + } +} \ No newline at end of file diff --git a/test-projects/gradle-7.4.2/settings.gradle b/test-projects/gradle-7.4.2/settings.gradle new file mode 100644 index 0000000..96a142a --- /dev/null +++ b/test-projects/gradle-7.4.2/settings.gradle @@ -0,0 +1,5 @@ +rootProject.name = 'javafxplugintests' + +include 'modular' +include 'non-modular' +include 'transitive' \ No newline at end of file diff --git a/test-projects/gradle-7.4.2/transitive/build.gradle b/test-projects/gradle-7.4.2/transitive/build.gradle new file mode 100644 index 0000000..8134554 --- /dev/null +++ b/test-projects/gradle-7.4.2/transitive/build.gradle @@ -0,0 +1,11 @@ +mainClassName = 'org.openjfx.gradle.javafx.test.Main' + +javafx { + version = '17.0.2' + modules = [ 'javafx.controls' ] +} + +dependencies { + // has dependency on javafx-controls-11.0.2 + implementation 'org.controlsfx:controlsfx:11.0.1' +} \ No newline at end of file diff --git a/test-projects/gradle-7.4.2/transitive/src/main/java/org/openjfx/gradle/javafx/test/Main.java b/test-projects/gradle-7.4.2/transitive/src/main/java/org/openjfx/gradle/javafx/test/Main.java new file mode 100644 index 0000000..cdeb22e --- /dev/null +++ b/test-projects/gradle-7.4.2/transitive/src/main/java/org/openjfx/gradle/javafx/test/Main.java @@ -0,0 +1,30 @@ +package org.openjfx.gradle.javafx.test; + +import javafx.application.Application; +import javafx.scene.Scene; +import javafx.scene.control.Label; +import javafx.scene.layout.StackPane; +import javafx.stage.Stage; + +public class Main extends Application { + + @Override + public void start(Stage primaryStage) { + StackPane root = new StackPane(new Label("Hello World!")); + + Scene scene = new Scene(root, 800, 600); + + primaryStage.setScene(scene); + primaryStage.show(); + + new Thread(() -> { + try { + Thread.sleep(500); + } catch (InterruptedException e) { + throw new RuntimeException("Should not happen!"); + } + + System.exit(0); + }).start(); + } +} \ No newline at end of file From b42402668b1499ca793015f32e42d426be5ab2f8 Mon Sep 17 00:00:00 2001 From: arlaneenalra Date: Sat, 28 May 2022 13:30:20 -0500 Subject: [PATCH 2/2] Fix mistaken @Internal annotation. --- src/main/java/org/openjfx/gradle/tasks/JavaFXTask.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/org/openjfx/gradle/tasks/JavaFXTask.java b/src/main/java/org/openjfx/gradle/tasks/JavaFXTask.java index 4357d9f..e49fee4 100644 --- a/src/main/java/org/openjfx/gradle/tasks/JavaFXTask.java +++ b/src/main/java/org/openjfx/gradle/tasks/JavaFXTask.java @@ -221,7 +221,6 @@ public void action() { * * @param classpath FileCollection to set as classpath. */ - @Internal public abstract void setTargetClasspath(final FileCollection classpath); /** @@ -229,7 +228,6 @@ public void action() { * * @param jvmArgs List of Jvm arguments to set on target task. */ - @Internal public abstract void setTargetJvmArgs(final List jvmArgs); /**