Gradle is the primary build tool for building OpenJFX. Since the repository includes a Gradle wrapper that will download the correct Gradle version when needed, you do not need to manually install Gradle. The current and minimum Gradle versions are defined in the source code. If you want to generate a wrapper yourself (for example, you want to build OpenJFX with a different Gradle version), then you will need to install Gradle.The
./ refers to the current directory) command used throughout this document can be replaced
gradle when not using the wrapper.
Note: gradle is available as an Ubuntu package, but check the version. This command should work after you set JAVA_HOME:
You will need Apache Ant 1.10.5 to build the OpenJFX apps (IMPORTANT: there are known issues with ant 1.9.x, so use either version 1.10.5 or 1.8.2).
At a minimum, you will need to have gradle in your pathSet the following environment variables:
JDK_HOMEto point to the root of your jdk-N release.
- if you do not use the wrapper, add
x.yis the version
IMPORTANT: Any time you change env settings or install new software after a failed build of JavaFX you should execute the following three commands:
gradlegradlew --stop rm -rf build gradlegradlew clean
The first is needed to stop any gradle daemons that might be running (by default gradle starts a daemon that is used to speed up subsequent builds). There is was a bug in the gradle daemon that causes gradle to ignore any env variables set after the daemon is started (see JDK-8193288). Additionally, on Windows platforms, the gradle daemon can sometimes interfere with your ability to delete files that it keeps open. If you run into problems you can stop the gradle daemon with "gradle gradlew --stop" (or disable the gradle daemon altogether).
Before diving directly into building OpenJFX, lets get our feet wet by learning what kinds of things we can call from the command line, and how to get help when we need it. The first command you should execute is tasks:
$ gradle./gradlew tasks ... :tasks ------------------------------------------------------------ All tasks runnable from root project ------------------------------------------------------------ Default tasks: sdk Basic tasks ----------- buildModuleBaseWin - creates javafx.base property files buildModuleGraphicsWin - copies javafx.graphics native libraries buildModuleLibsWin buildModuleMediaWin - copies javafx.media native libraries buildModuleSWTWin - copies SWT JAR buildModuleWebWin - copies javafx.web native libraries clean - Deletes the build directory and the build directory of all sub projects cleanAll - Scrubs the repo of build artifacts javadoc - Generates the JavaDoc for all the public API javafxSwtWin - Creates the javafx-swt.jar for the win target sdkWin Build tasks ----------- assemble - Assembles the outputs of this project. build - Assembles and tests this project. buildDependents - Assembles and tests this project and all projects that depend on it. buildModulesWin buildModuleWin buildModuleZipWin buildNeeded - Assembles and tests this project and all projects it depends on. buildRunArgsWin ccWinFont - Compiles native sources for font for win ccWinGlass - Compiles native sources for glass for win ccWinIio - Compiles native sources for iio for win ccWinPrism - Compiles native sources for prism for win ccWinPrismD3D - Compiles native sources for prismD3D for win ccWinPrismES2 - Compiles native sources for prismES2 for win ccWinPrismSW - Compiles native sources for prismSW for win classes - Assembles main classes. clean - Deletes the build directory. cleanNative - Clean all native libraries and objects for Graphics cleanNativeDecora - Clean native objects for Decora cleanNativeFont - Clean native objects for font cleanNativeGlass - Clean native objects for glass cleanNativeIio - Clean native objects for iio cleanNativePrism - Clean native objects for prism cleanNativePrismD3D - Clean native objects for prismD3D cleanNativePrismES2 - Clean native objects for prismES2 cleanNativePrismSW - Clean native objects for prismSW createMSPfile generateD3DHeaders - Generate headers by compiling hlsl files jar - Assembles a jar archive containing the main classes. jslcClasses - Assembles jslc classes. linkWinFont - Creates native dynamic library for font for win linkWinGlass - Creates native dynamic library for glass for win linkWinIio - Creates native dynamic library for iio for win linkWinPrism - Creates native dynamic library for prism for win linkWinPrismD3D - Creates native dynamic library for prismD3D for win linkWinPrismES2 - Creates native dynamic library for prismES2 for win linkWinPrismSW - Creates native dynamic library for prismSW for win native - Compiles and Builds all native libraries for Graphics nativeDecora - Generates JNI headers, compiles, and builds native dynamic library for Decora nativeFont - Generates JNI headers, compiles, and builds native dynamic library for font for all compile targets nativeGlass - Generates JNI headers, compiles, and builds native dynamic library for glass for all compile targets nativeIio - Generates JNI headers, compiles, and builds native dynamic library for iio for all compile targets nativePrism - Generates JNI headers, compiles, and builds native dynamic library for prism for all compile targets nativePrismD3D - Generates JNI headers, compiles, and builds native dynamic library for prismD3D for all compile targets nativePrismES2 - Generates JNI headers, compiles, and builds native dynamic library for prismES2 for all compile targets nativePrismSW - Generates JNI headers, compiles, and builds native dynamic library for prismSW for all compile targets rcFont - Compiles native sources for font rcGlass - Compiles native sources for glass rcIio - Compiles native sources for iio rcPrism - Compiles native sources for prism rcPrismD3D - Compiles native sources for prismD3D rcPrismES2 - Compiles native sources for prismES2 rcPrismSW - Compiles native sources for prismSW shadersClasses - Assembles shaders classes. shimsClasses - Assembles shims classes. stubClasses - Assembles stub classes. testapp1Classes - Assembles testapp1 classes. testapp2Classes - Assembles testapp2 classes. testapp3Classes - Assembles testapp3 classes. testapp4Classes - Assembles testapp4 classes. testapp5Classes - Assembles testapp5 classes. testapp6Classes - Assembles testapp6 classes. testClasses - Assembles test classes. toolsClasses - Assembles tools classes. Build Setup tasks ----------------- init - Initializes a new Gradle build. wrapper - Generates Gradle wrapper files. Documentation tasks ------------------- javadoc - Generates Javadoc API documentation for the main source code. Help tasks ---------- buildEnvironment - Displays all buildscript dependencies declared in root project 'rt'. components - Displays the components produced by root project 'rt'. [incubating] dependencies - Displays all dependencies declared in root project 'rt'. dependencyInsight - Displays the insight into a specific dependency in root project 'rt'. dependentComponents - Displays the dependent components of components in root project 'rt'. [incubating] help - Displays a help message. model - Displays the configuration model of root project 'rt'. [incubating] projects - Displays the sub-projects of root project 'rt'. properties - Displays the properties of root project 'rt'. tasks - Displays the tasks runnable from root project 'rt' (some of the displayed tasks may belong to subprojects). Publishing tasks ---------------- generateMetadataFileForJavafxPublication - Generates the Gradle metadata file for publication 'javafx'. generateMetadataFileForMavenPublication - Generates the Gradle metadata file for publication 'maven'. generatePomFileForJavafxPublication - Generates the Maven POM file for publication 'javafx'. generatePomFileForMavenPublication - Generates the Maven POM file for publication 'maven'. publish - Publishes all publications produced by this project. publishJavafxPublicationToMavenLocal - Publishes Maven publication 'javafx' to the local Maven repository. publishJavafxPublicationToMavenRepository - Publishes Maven publication 'javafx' to Maven repository 'maven'. publishMavenPublicationToMavenLocal - Publishes Maven publication 'maven' to the local Maven repository. publishMavenPublicationToMavenRepository - Publishes Maven publication 'maven' to Maven repository 'maven'. publishToMavenLocal - Publishes all Maven publications produced by this project to the local Maven cache. Verification tasks ------------------ check - Runs all checks. test - Runs the unit tests. To see all tasks and more detail, run gradle tasks --all To see more detail about a task, run gradle help --task <task> BUILD SUCCESSFUL in 19s 1 actionable task: 1 executed
Gradle then tells us what the default tasks are. In this case, our default task is the 'sdk' task. This is the task that will be executed if you just call 'gradle' alone without providing any additional arguments. After this comes a listing of different tasks, broken out by group. The first group is the "Basic" group which contains the tasks you may find yourself using most often. These are all named and have a description provided. For example, if I wanted to execute the 'clean' task, then I would do so like this:
$ gradle./gradlew clean
Finally, the tasks task gives us a useful hint that we can pass the --all argument in order to see all of the tasks in more detail. This produces a lot more output, but really gives an in depth look at what tasks are available for you to call.
I mentioned above that our root project is called "rt", and that we have sub-projects in the gradle build. To see all of the projects available to you, execute the projects task (which you will notice was in the "Help tasks" group produced by the tasks task). This lists not just what projects are available, but what their name is, and what the project hierarchy is.
$ gradle./gradlew projects ... :projects ------------------------------------------------------------ Root project ------------------------------------------------------------ Root project 'rt' +--- Project ':apps' +--- Project ':base' +--- Project ':controls' +--- Project ':fxml' +--- Project ':graphics' +--- Project ':media' +--- Project ':swing' +--- Project ':swt' +--- Project ':systemTests' \--- Project ':web' To see a list of the tasks of a project, run gradle <project-path>:tasks For example, try running gradle :apps:tasks BUILD SUCCESSFUL in 1s 1 actionable task: 1 executed
There are a couple other tricks-of-the-trade that you should be aware of. You can execute any gradle command with
--debug in order to get more output. Running in
--info mode provides some additional debugging output that is very useful when things go wrong.
One more trick is the
--profile argument. You can perform any gradle task and use the
--profile argument. This will cause gradle to keep track of how long various parts of the build took, and will produce an HTML report in build/reports/profile. The report breaks down how much time was spent in configuration, dependency resolution, and task execution. It further breaks it down by project. This gives useful metrics for tracking down which parts of the build take the longest and hopefully tighten up the build times.
The simplest basic task to build is the sdk task. The sdk task will compile all Java sources and all native sources for your target platform. It is the default task which is executed if you do not supply a specific task to run. It will create the appropriate sdk directory and populate it with the native dynamic libraries and the jfxrt.jar. Because the SDK is not distributed with documentation, the javadocs are not created as part of the sdk task by default. Once the sdk task has completed, you will have and SDK distribution which you could run against or give to somebody else to run.
$ gradle./gradlew ... :buildModulesLinux :buildRunArgsLinux :buildModules :createTestArgfilesLinux :sdkLinux :sdk BUILD SUCCESSFUL in 1m 48s 127 actionable tasks: 127 executed
By default, the OpenJFX build system will only build the SDK for the desktop platform you are building from. To ask it to build for a specific compile target, you must pass a COMPILE_TARGETS property to the build system, instructing it which to build. This is a comma separated list. Assuming you have already setup the prerequisites for building ARM (for example, when targeting the Raspberry PI), you would invoke gradle like this:
$ gradle./gradlew -PCOMPILE_TARGETS=armv6hf
The next basic task which you may want to perform is test. The test task will execute the unit tests. You generally will execute the top level test because unlike with Ant, Gradle will only re-execute those tests which have changed (or were dependent on code that was changed) on subsequent runs. You can of course execute gradle cleanTest in order to clean all the test results so they will run fresh. Or, if you want to execute only those tests related to a single project, you can do so in the normal fashion:
$ gradle./gradlew :base:test The CompileOptions.useAnt property has been deprecated and is scheduled to be removed in Gradle 2.0. There is no replacement for this property. :base:processVersion UP-TO-DATE :build-tools:generateGrammarSource UP-TO-DATE :build-tools:compileJava UP-TO-DATE :build-tools:processResources UP-TO-DATE :build-tools:classes UP-TO-DATE :build-tools:jar UP-TO-DATE :base:compileJava UP-TO-DATE :base:processResources UP-TO-DATE :base:classes UP-TO-DATE :base:compileTestJava UP-TO-DATE :base:processTestResources UP-TO-DATE :base:testClasses UP-TO-DATE > Building > :base:test > 3411 tests completed, 45 skipped
Gradle gives helpful output during execution of the number of tests completed and the number skipped without dumping out lots of output to the console (unless you opt for
--info). Also, once the tests complete, an HTML report is dumped to the project's build/reports/test directory (for example, modules/base/build/reports/test):