Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add start script handling for Distributions tasks #127

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 16 additions & 3 deletions build.gradle
Original file line number Diff line number Diff line change
@@ -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'
Expand Down Expand Up @@ -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 {
Expand Down
3 changes: 2 additions & 1 deletion gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
Expand Up @@ -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
4 changes: 4 additions & 0 deletions settings.gradle
Original file line number Diff line number Diff line change
@@ -1 +1,5 @@
plugins {
id "com.gradle.enterprise" version "3.10.1"
}

rootProject.name = 'javafx-plugin'
2 changes: 2 additions & 0 deletions src/main/java/org/openjfx/gradle/JavaFXPlugin.java
Original file line number Diff line number Diff line change
Expand Up @@ -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<Project> {

Expand All @@ -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);
}
}
90 changes: 17 additions & 73 deletions src/main/java/org/openjfx/gradle/tasks/ExecTask.java
Original file line number Diff line number Diff line change
Expand Up @@ -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<String>();
jvmArgs.add("--add-modules");
jvmArgs.add(String.join(",", definedJavaFXModuleNames));
@Override
public FileCollection getClasspath() {
return getExecTask().getClasspath();
}

List<String> 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<String> 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<String> getTargetJvmArgs() {
return getExecTask().getJvmArgs();
}
}
Loading