ValentinDP
ValentinDP

Reputation: 323

How to replace VM Arguments with module-info.java file

I have just started a new project based on AdoptOpenJDK 11 and OpenJavaFX 11.

Before during my development, I used VM Arguments which was not always practical when you pass the project to someone else.

So I started to replace my VM Arguments with the module-info.java file.

VM Arguments before:

--module-path ${PATH_TO_FX} –add-modules javafx.controls,javafx.fxml 

--add-opens
javafx.base/com.sun.javafx.runtime=ALL-UNNAMED
--add-opens
javafx.controls/com.sun.javafx.scene.control.behavior=ALL-UNNAMED
--add-opens
javafx.controls/com.sun.javafx.scene.control=ALL-UNNAMED
--add-opens
javafx.base/com.sun.javafx.binding=ALL-UNNAMED
--add-opens
javafx.base/com.sun.javafx.event=ALL-UNNAMED
--add-opens
javafx.graphics/com.sun.javafx.stage=ALL-UNNAMED
--add-opens
javafx.graphics/com.sun.javafx.scene=ALL-UNNAMED

module-info.java file now:

module hellofx {

requires javafx.controls;
requires javafx.fxml;
requires transitive javafx.graphics;

opens org.openjfx to javafx.fxml;
exports org.openjfx;

}

This is where I have a problem, I managed to replace the tag --module path but I can not find a solution for tags --add-open.

Can someone help me?

Edit 12/09:

Now I have a new error with this two lines in the module-info.java

Duplicate requires entry: javafx.fxml

How I can solve this?

Upvotes: 2

Views: 3862

Answers (1)

CaspianTerrazzo
CaspianTerrazzo

Reputation: 2148

Option A Quick and clean :

Change


module hellofx {

requires javafx.controls;
requires javafx.fxml;
requires transitive javafx.graphics;

//wrong
opens org.openjfx to javafx.fxml;

//right
opens com.your.package to javafx.fxml, javafx.controls;

exports org.openjfx;

}

Option B (Because building a Jar with javaFX seems to be wierd)

You also can do this with Gradle (because you then can easily build your JavaFX jar without much of a Problem)

You should add the gradle fx Plugin, and define Compile arguments.

When you use Gradle you also don't need to download the openJavaFX library manually.

Here is how your Gradle file should look like




buildscript {
    dependencies {
        classpath group: 'de.dynamicfiles.projects.gradle.plugins', name: 'javafx-gradle-plugin', version: '8.7.0'
        classpath 'org.openjfx:javafx:11'

    }
    repositories {
        mavenLocal()
        mavenCentral()
         maven {
            url "https://plugins.gradle.org/m2/"
        }

    }
}

plugins {
    id 'eclipse'
    id 'java'
    id 'java-library'
    id 'application'
    // This is very Important!
    id 'org.openjfx.javafxplugin' version '0.0.8'
    id 'org.beryx.jlink' version '2.12.0'
}

sourceCompatibility = 11
targetCompatibility = 11
repositories {
    jcenter()
    mavenCentral()
}



mainClassName="com.your.MainLauncher"



// Use this for the Runtime, to run with the required Modules

javafx {
    version = "11"
    modules = [ 'javafx.controls', 'javafx.fxml','javafx.graphics']
}


sourceSets {
    main.java.srcDir "src/main/java"
    main.resources.srcDir "src/main/resources"
}

// Your dependecies
dependencies {

    compile group: 'org.openjfx', name: 'javafx', version: '11.0.2'
    // JAVA FX dependecy. Important!
    // Add your other dependecies


}

// to build the jar
jar {
  manifest {
    attributes(
      'Main-Class': 'com.your.MainLauncher'
    )

  }
  from {
        configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
    }
}

// to "include compile arguments " that replace your VM arguments
compileJava {
    doFirst {
        options.compilerArgs = [
                '--module-path', classpath.asPath,
                '--add-modules', 'javafx.controls,javafx.fxml,javafx.graphics'
        ]
        println options.compilerArgs
    }

}


you can run this with gradle but also with eclipse. When you build the jar there are also no VM arguments required. I Hope this will help you.

This does also run out of your IDE(intelliJ / Eclipse) if you have Gradle Support plugins installed.

Upvotes: 2

Related Questions