- Loading...
...
Building a UI toolkit for many different platforms is a complex and challenging endeavor. It requires platform specific tools such as C compilers as well as portable tools like Gradle and the JDK. Which tools must be installed differs from platform to platform. While the OpenJFX build system was designed to remove as many build hurdles as possible, it is necessary to build native code and have the requisite compilers and toolchains installed. On Mac and Linux this is fairly easy, but setting up Windows is more difficult.
For a ready made build, you can download it from the JDK 10, download page (or you can grab a JDK 11 early access build), or try the Community Build page.
If you are looking for instructions to build FX for JDK 8uNNN, they have been archived here.
...
Do you really want to build OpenJFX? We would like you to, but the latest stable build is already available on the JavaFX website, and JavaFX 8 is bundled by default in in Oracle JDK desktop editions of JDK 8, JDK (9 , and the JDK 10 builds10 also included JavaFX, but were superseded by 11, which does not). There are also some great community builds that may work for you.
Starting with Java 9, and the introduction of the module system, The FX modules are now an integral part of the runtime environment for the desktop. Because of this tie, there is currently no provision or capability for the output of the OpenJFX 9 or later build to be used as an overlay. It is still possible however to develop and enhance OpenJFX, and use that result to build an OpenJDK.
We are exploring making this easier, by enabling a We are exploring making this easier, by enabling a developer to build a set of javafx.* modules that can be used with a clean OpenJDK build (without the javafx.* modules). Stay tuned.
Building WebKit as part of building JavaFX is optional and requires additional steps; these are detailed per operating system below. If you do not build WebKit, you can use pre-built libraries as detailed here.
You will need Windows 10 You will need Windows 7 or later (Windows 10 is recommended) 64-bit OS.
You need to have the following tools installed:
openssh
zip
unzip
make
(needed to compile media)makedepend
(needed for media)git
Desktop development with C++
workload is required at most, but it may be possible to install individual components to satisfy the requirements.Microsoft DirectShow header files – If you build
...
WebKit (it is not built by default) you will need the
...
following additional tools:
bison
flex
gperf
perl (5.10 or later)
python3
ruby (2.5 or later)
All commands on this page are run inside Cygwin (and not in Windows CMD).
The JavaFX build will automatically locate your Visual Studio installation, as long as you installed it in the default location. You no longer need to set any
...
If you build WebKit (it is not built by default) you will need the following additional tools:
All commands on this page are ran inside Cygwin (and not in Windows CMD).
You will likely need to set the following env variables to point to your VS 2017 2022 installation, since Microsoft no longer sets such variables. This presumes that:
C:\Program Files\Java\jdk-10
.C:\Program Files (x86)\Microsoft Visual Studio\2017\Community
. If this isn't set correctly, you might see an error during the build saying that vcvars32.bat
is missing.C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC
is 14.11.25503
. If this isn't set correctly, you might see an error during the :graphics:compileDecoraNativeShadersWin
build task saying that cl.exe
is missing.You should adjust these as needed for your system.
unless you installed Visual Studio in a non-standard location, for example, the D:
drive instead of the default C:
drive.
The initial build process that generates the needed resources is done by the buildSrc
folder. On Windows, it tries to locate all the needed tools and write their paths to the build\windows_tools.properties
file. If it fails, the file is left blank, which results in a fatal error. In this case, define the VSCOMNTOOLS
variable (older versions of JavaFX used VS150COMNTOOLS
) to point to the VC\Auxiliary\Build
directory in your Visual studio Installation. For example, use the following if you installed Visual Studio 2022 on the D:
drive.
Code Block |
---|
export VSCOMNTOOLS="D:\\Program Files |
Code Block |
export VS150COMNTOOLS="C:\\Program Files (x86)\\Microsoft Visual Studio\\20172022\\Community\\VC\\Auxiliary\\Build" export JAVA_HOME="C:/Program Files/Java/jdk-10" export MSVC_VER=14.11.25503 |
Note the use of the double backslash in the VS150COMNTOOLS
the VSCOMNTOOLS
env var. This is needed because the cygwin shell uses the '\' as an escape character. With JAVA_HOME
it is easier to just set it using forward slashes (although backslashes are fine as long as you escape them).
If these definitions aren't persisted between launches of Cygwin, you can either set them in the Windows Environment Variables UI or in the /home/$user$/.bash_profile
file (these are ran on startup). Use export -p
to verify that the env variables are set correctly.
You will need macOS 10. 12 (SierraMonterey) or later.
Install the following software:
If you build WebKit (it is not built by default) you will need the following additional tools:
...
Setting up a Linux build configuration is fairly straightforward. These build instructions were used for Ubuntu 1618.04.
...
First, run the following command to install all the required development packages:TODO: verify and update this (I think many are unused)
sudo apt-get update sudo apt-get install ksh libasound2-dev libgl1-mesa-dev \ libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev libjpeg-dev \ libpng-dev libx11-dev libxml2-dev libxslt1-dev libxt-dev \ libxxf86vm-dev pkg-config x11proto-corelibavformat-ffmpeg57 libgl1-mesa-dev \ x11protolibx11-xf86vidmodedev pkg-devconfig libavcodecx11proto-core-dev mercurialgit \
libgtk2.0-dev libgtk-3-dev \ libxtst-dev libudev-dev libavformat-dev
If you build WebKit (it is not built by default) you will need the following additional tools:
perl (5.10 or later)
python3
ruby (2.5 or later)
The following should satisfy the requirements (but check the version of cmake) :
sudo apt-get install cmake bison flex gperf ruby gperf ruby
Same as Ubuntu 18.04 with the following changes for sudo apt-get install
:
libavformat-ffmpeg57
to libavformat58
libxxf86vm-dev
We use Oracle Linux 7 to build the javafx.* modules that we ship with the Oracle JDK releases. Here are the packages you will need:
TODO: verify and update this
yum install mercurial git bison flex gperf pkgconfig \
gtk2-devel gtk3-devel pango-devel freetype-devel
Run the following commands (using Java 11 here as an example):
sudo yum update
sudo yum install
...
git bison flex
...
pkgconfig
...
gtk2-devel gtk3-devel \
...
pango-devel freetype-devel libXtst-devel
...
java-11-openjdk-devel ant
...
gcc-c++
sudo yum install epel-release
sudo yum config-manager --set-enabled PowerTools
sudo yum update
sudo yum install libstdc++-static
sudo alternatives --config java
(specify Java 11)
OpenJFX N is formally compatible with JDK N and N-1. For OpenJFX 22, download OpenJDK 21
Download and install OpenJDK 10 or later to use as the boot JDK to build and test OpenJFX. We recommend JDK 10.0.1.
...
to use the latest version, however, Gradle might not support that version, so a version that Gradle supports might also be required to run Gradle itself (though it will use the latest version of the JDK through toolchain support).
OpenJFX (and OpenJDK) transitioned to Git as part of Project Skara. The OpenJFX repo is hosted on GitHub at openjdk/jfx. We encourage developers to become familiar with Git and GitHub.
Many (if not all) IDEs include built in support
...
. For example, Eclipse uses EGit, which can be downloaded through the built-in update site http://download.eclipse.org/releases/latest/ under Collaboration > Java implementation of Git.
For Linux,
...
the git
package is included in the list of required packaged that were installed
...
. On Windows, you can also install
...
git as a
...
Cygwin package.
Popular GUI options include SourceTree for Windows or Mac from Atlassian and TortoiseGit for Windows.
Gradle is the primary build tool for building OpenJFX. We currently use Gradle 4.8 for jfx-dev (IMPORTANT: Only this version is regularly tested)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 sh gradlew
command used throughout this document can be replaced with gradle
when not using the wrapper.
Note: gradle is available as a Ubuntu packagean Ubuntu package, but check the version. This command should work after you set JAVA_HOME:
...
You will need Apache Ant 1.810.25 to build the OpenJFX apps (IMPORTANT: there are known issues with later versions of antant 1.9.x, so get exactly version 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:
JAVA_HOME
and JDK_HOME
to point to the root of your jdk-9 or jdk-10 EA release.N release$JAVA_HOME/bin
to your PATH
gradle-
4x.
3y/bin
to your PATH
where x.y
is the versionapache-ant-1.
810.
25/bin
to your PATH
Note: on windows, the JAVA_HOME and JDK_HOME variables must be in DOS format (e.g., "C:/Program Files/..." rather than "/cygdrive/c/Program Files/..."), although you can use forward slashes ('/'). Test your settings with:
Code Block |
---|
"$JAVA_HOME/bin/java" -version gradle -version ant -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:
Code Block |
---|
gradlesh gradlew --stop rm -rf build gradlesh gradlew 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 --stop" (or disable the gradle daemon altogether).
...
All OpenJFX sources are held in mercurial repositories. As mentioned in Repositories and Releases, we have several different repositories for you to choose from, although most developers should use the mainline jfx-def repo. in https://github.com/openjdk/jfx (see Repositories and Releases). To clone the repo from the command line, use:
Code Block | ||
---|---|---|
| ||
# for the active development stream, currently targeted for JDK 1114 hggit clone httphttps://hg.openjdk.java.net/openjfx/jfx-dev/rtgithub.com/openjdk/jfx.git |
Other tools will have a clone option(Note: Historically you also had to clone the top "jfx" repository in the forest that you cared about. However we have modified our approach, such that we no longer promote the use of a forest, and instead are putting all of our sources in a single repository, named "rt").
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:
Code Block |
---|
$ gradlesh gradlew tasks ... :tasks ------------------------------------------------------------ All tasks runnable from root project ------------------------------------------------------------ Default tasks: sdk Basic tasks ----------- buildModuleBaseLinuxbuildModuleBaseWin - creates javafx.base property files buildModuleGraphicsLinux - copies javafx.graphics native libraries buildModuleLibsLinux buildModuleMediaLinux files buildModuleGraphicsWin - copies javafx.mediagraphics native libraries buildModuleLibsWin buildModulePackagerExeLinuxbuildModuleMediaWin - copies jdkjavafx.packager executable buildModulePackagerLibsLinux - copies jdk.packagermedia native libraries buildModuleSWTLinuxbuildModuleSWTWin - copies SWT JAR buildModuleWebLinuxbuildModuleWebWin - 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 javafxSwtLinuxjavafxSwtWin - Creates the javafx-swt.jar for the linuxwin target sdkWin sdkLinux Build tasks ----------- antpluginClasses - Assembles antplugin classes. 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. buildJavaPackagerbuildModulesWin buildModuleLinuxbuildModuleWin buildModulesLinux buildModuleZipLinuxbuildModuleZipWin buildNeeded - Assembles and tests this project and all projects it depends on. buildRunArgsLinuxbuildRunArgsWin ccLinuxFontccWinFont - Compiles native sources for font for linuxwin ccLinuxFontFreetypeccWinGlass - Compiles native sources for fontFreetypeglass for linuxwin ccLinuxFontPangoccWinIio - Compiles native sources for fontPangoiio for linuxwin ccLinuxGlassGlassccWinPrism - Compiles native sources for glassprism for linux for variant Glass ccLinuxGlassGlassgtk2win ccWinPrismD3D - Compiles native sources for glass for linuxprismD3D for variant Glassgtk2win ccLinuxGlassGlassgtk3ccWinPrismES2 - Compiles native sources for glassprismES2 for linux for variant Glassgtk3 ccLinuxIiowin ccWinPrismSW - Compiles native sources for iioprismSW for linuxwin ccLinuxPrismclasses - Assembles Compiles native sources for prism for linux ccLinuxPrismES2 - Compiles native sources for prismES2 for linux ccLinuxPrismSW - Compiles native sources for prismSW for linux classes - Assembles main classes. clean - Deletes the build directory. cleanNative - Clean all native libraries and objects for Graphics cleanNativeDecoramain 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 DecoraprismD3D cleanNativeFontcleanNativePrismES2 - Clean native objects for fontprismES2 cleanNativeFontFreetypecleanNativePrismSW - Clean native objects for fontFreetype cleanNativeFontPango - Clean native objects for fontPango cleanNativeGlass - Clean native objects for glass cleanNativeIio - Clean native objects for iio cleanNativePrism - Clean native objects for prism cleanNativePrismES2 - Clean native objects for prismES2 cleanNativePrismSW - Clean native objects for prismSW compileLinuxLauncher - Compiles native sources for the application co-bundle launcher compileLinuxLibrary - Compiles native sources for the application co-bundle launcher library createMSPfile jar - Assembles a jar archive containing the main classes. jslcClasses - Assembles jslc classes. linkLinuxFont - Creates 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 linuxtargets linkLinuxFontFreetypenativeGlass - Creates Generates JNI headers, compiles, and builds native dynamic library for fontFreetypeglass for all compile linuxtargets linkLinuxFontPangonativeIio - Creates native dynamic library for fontPango for linux linkLinuxGlassGlass - CreatesGenerates JNI headers, compiles, and builds native dynamic library for glassiio for linuxall forcompile variant Glasstargets linkLinuxGlassGlassgtk2nativePrism - Creates Generates JNI headers, compiles, and builds native dynamic library for glassprism for linuxall forcompile variant Glassgtk2targets linkLinuxGlassGlassgtk3nativePrismD3D - Creates Generates JNI headers, compiles, and builds native dynamic library for glassprismD3D for linuxall forcompile variant Glassgtk3targets linkLinuxIionativePrismES2 - CreatesGenerates nativeJNI dynamic library for iio for linux linkLinuxLauncher - Linksheaders, compiles, and builds native dynamic library for prismES2 thefor applicationall co-bundlecompile launchertargets linkLinuxLibrarynativePrismSW - Links Generates JNI headers, compiles, and builds native dynamic library for theprismSW applicationfor co-bundleall launchercompile librarytargets linkLinuxPrismrcFont - CreatesCompiles native dynamic library for prism sources for font rcGlass - Compiles native sources for linuxglass linkLinuxPrismES2rcIio - CreatesCompiles native dynamic librarysources for prismES2 for linux linkLinuxPrismSWiio rcPrism - CreatesCompiles native dynamic library for prismSWsources for linuxprism nativercPrismD3D - Compiles and Builds all native librariessources for GraphicsprismD3D nativeDecorarcPrismES2 - Compiles Generatesnative JNIsources headers, compiles, and buildsfor prismES2 rcPrismSW - Compiles native dynamic librarysources for DecoraprismSW nativeFontshadersClasses - GeneratesAssembles JNI headers, compiles, and builds native dynamic library for font for all compile targets nativeFontFreetype - Generates JNI headers, compiles, and builds native dynamic library for fontFreetype for all compile targets nativeFontPango - Generates JNI headers, compiles, and builds native dynamic library for fontPango 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 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 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 ---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 ---------------- javadocgenerateMetadataFileForJavafxPublication - Generates Javadoc API documentation for the mainGradle 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).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 4s19s 1 actionable task: 1 executed |
The tasks task is extremely helpful. You use it to discover all the other things you can do with this build file. You notice at the top of the output the phrase "All tasks runnable from root project". The "root" project is "javafxrt". That is, we are in the root project. Below the root project are a series of sub projects, some of which are referred to as modules or "components". But more about those later.
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 executing the 'clean' task , then I would do so would be done like this:
Code Block |
---|
$ sh gradlegradlew 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 As mentioned above that our , the 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 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.
Code Block |
---|
$ sh gradlegradlew projects ... :projects ------------------------------------------------------------ Root project ------------------------------------------------------------ Root project 'rt' +--- Project ':apps' +--- Project ':base' +--- Root Projectproject ':controlsrt' +--- Project ':fxmlapps' +--- Project ':fxpackagerbase' +--- Project ':fxpackagerservicescontrols' +--- Project ':graphicsfxml' +--- Project ':jmxgraphics' +--- 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 --info
or --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.
Code Block |
---|
$ sh gradlegradlew ... :buildModulesLinux :buildRunArgsLinux :buildModules :createTestArgfilesLinux :sdkLinux :sdk BUILD SUCCESSFUL in 1m 48s 127 actionable tasks: 127 executed |
...
The sdk task will build an OpenJFX SDK for your particular platform. Gradle automatically handles the downloading of all dependencies (such as Antlr and SWT located under \rt\build\libs
).
For more information on build properties, see Customizing the Build.
...
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:
Code Block |
---|
$ sh gradlegradlew -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 may want to perform is test. The test task will execute the unit tests for all projects (all modules). If you want to execute only those tests related to a single project, you can do so in the normal fashion:
Code Block |
---|
$ sh gradlegradlew :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):
...
For the sake of performance, most of the tests are configured to run in the same VM. However some tests by design cannot be run in the same VM, and others cannot yet run in the same VM due to bugs or issues in the test. In order to improve the quality of the project we need to run as many tests as possible in the same VM. The more tests we can run on pre-integration the less likely we are to see failures leak into master. Being able to run 20,000 tests in a minute is extremely useful, but not possible, unless they run in the same VM. Something to keep in mind.
When running a system test that requires the Robot API, additional flags need to be passed:
Code Block |
---|
sh gradlew -PFULL_TEST=true -PUSE_ROBOT=true :systemTests:test --tests TestClassName |
...
Test, review and commit as normal.