Java: Difference between revisions

imported>Milahu
Ivy: not to be confused with ivy
jdk11: alternatives to overriding cacert for jdk11+
 
(17 intermediate revisions by 10 users not shown)
Line 9: Line 9:
== JDK options ==
== JDK options ==


Your default choice should probably be to install <code>jdk11</code>, which is an alias for <code>openjdk11</code>. If you're in a server environment, go for <code>jdk11_headless</code>. Java 11 is the currently-maintained LTS version of OpenJDK as of March 2021.
Your default choice should probably be to install <code>jdk</code>, which is an alias to the latest [https://en.wikipedia.org/wiki/Long-term_support LTS]. If you're in a server environment, go for <code>jdk21_headless</code>. Java 21 is the currently-maintained LTS version of OpenJDK as of April 2024.


As you might expect, though, many flavors of Java are available in NixOS.
As you might expect, though, many flavors of Java are available in NixOS.


* OpenJDK, by far the most popular non-Oracle JVM implementation
* OpenJDK, by far the most popular non-Oracle JVM implementation
** <code>openjdk8[_headless]</code> for a legacy Java 8 VM required by some older apps
** <code>jdk8[_headless]</code> for a legacy Java 8 VM required by some older apps
** <code>openjdk11[_headless]</code>, the currently-supported LTS version of OpenJDK
** <code>jdk21[_headless]</code>, the currently-supported LTS version of OpenJDK
** <code>openjdk14[_headless]</code>, the current version of OpenJDK
** <code>jdk22[_headless]</code>, the current version of OpenJDK
* AdoptOpenJDK, prebuilt binaries for OpenJDK
* Temurin, formerly AdoptOpenJDK, prebuilt binaries for OpenJDK
** <code>adoptopenjdk-bin</code> points to the latest version of AdoptOpenJDK, which is version 11 at the time of writing.
** <code>temurin-bin</code> points to the latest version of Temurin, which is version 21 at the time of writing.
** <code>adoptopenjdk-jre-bin</code> is available if you want to avoid downloading the compiler and only require the runtime environment.
** <code>temurin-jre-bin</code> is available if you want to avoid downloading the compiler and only require the runtime environment.
** <code>adoptopenjdk{,-jre}-openj9-bin-{8,11,13}</code> same, but using [https://en.wikipedia.org/wiki/OpenJ9 Eclipse OpenJ9] instead of HotSpot as its JVM.
* JetBrains JDK (<code>jetbrains.jdk</code>), a fork of OpenJDK with modifications made by JetBrains
* JetBrains JDK (<code>jetbrains.jdk</code>), a fork of OpenJDK with modifications made by JetBrains
* Oracle's JDK (<code>oraclejdk</code>), only version 8 is available.
* Oracle's JDK (<code>oraclejdk</code>), only version 8 is available.
== VSCode + Language Support for Java (TM) by Red Hat extension ==
Unfortunately the extension contains and uses a version of the JRE which makes use of dynamically loaded libraries, which nix cannot accomodate out-of-the-box. Fortunately there's a simple solution in the use of [https://github.com/Mic92/nix-ld nix-ld]. Here's a simple <code>flake.nix</code> snippet to get you started (I'll focus on the <code>devShell</code> part for brevity):
<syntaxhighlight lang="nix" line highlight="6,10" copy>
# flake.nix
devShell = pkgs.mkShell {
  buildInputs = [
    pkgs.gradle
    pkgs.jdk17
  ];
  NIX_LD_LIBRARY_PATH = pkgs.lib.makeLibraryPath [
    pkgs.stdenv.cc.cc
    pkgs.openssl
  ];
  NIX_LD = pkgs.lib.fileContents "${pkgs.stdenv.cc}/nix-support/dynamic-linker";
  # ^--- when using direnv, this line will require the 'use flake --impure' option.
};
</syntaxhighlight>
The important lines above are the two starting with <code>NIX_LD...</code>. They will let nix-ld wrap the required, dynamically loaded libraries so that they are found when building the <code>devShell</code>.
Another solution is to use the <code>[https://github.com/redhat-developer/vscode-java?tab=readme-ov-file#supported-vs-code-settings java.jdt.ls.java.home]</code> VSCode setting to point to a nix-built Java 17. For example, using home-manager's settings: <syntaxhighlight lang="nix">
programs.vscode.enable = true;
programs.vscode.extensions = [ pkgs.vscode-extensions.redhat.java ];
programs.vscode.userSettings = {
  "java.jdt.ls.java.home" = "${pkgs.jdk17}";
};
</syntaxhighlight>Note that this will still result in the extension downloading its own JRE, it just will not be used.


== Using Oracle JDK instead of Open JDK ==
== Using Oracle JDK instead of Open JDK ==
Almost all Java packages in nixpkgs use Open JDK in form of a '''jre''' dependency. If you use Oracle JDK and also want other applications to use it, you can simply tweak your <code>.nixpkgs/config.nix</code> so that your desired application uses Oracles JDK or JRE.
Almost all Java packages in nixpkgs use Open JDK in form of a '''jre''' dependency. If you use Oracle JDK and also want other applications to use it, you can simply tweak your <code>nixpkgs/config.nix</code> so that your desired application uses Oracles JDK or JRE.


Example with UMLet with JRE  
Example with UMLet with JRE  
Line 40: Line 70:


To install the Oracle JRE system-wide, you need to explicitly accept the license in addition to allowing unfree modules:
To install the Oracle JRE system-wide, you need to explicitly accept the license in addition to allowing unfree modules:
<syntaxhighlight lang="nix">
<syntaxhighlight lang="nix">
# /etc/nixos/configuration.nix
# /etc/nixos/configuration.nix
Line 48: Line 79:
</syntaxhighlight>
</syntaxhighlight>


Working with `requireFile` (manual downloading the tarballs and manual adding in to the nix store) might be annoying and nixops-unfriendly, so it can be overridden in overlays
Working with <code>requireFile</code> (manual downloading the tarballs and manual adding in to the nix store) might be annoying and nixops-unfriendly, so it can be overridden in overlays


<syntaxhighlight lang="nix">
<syntaxhighlight lang="nix">
Line 77: Line 108:
== Better font rendering==
== Better font rendering==


By default java does not enable antialiasing for font rendering. By exporting environment variables, this can be fixed:
By default java does not enable anti-aliasing for font rendering. By exporting environment variables, this can be fixed:


<syntaxhighlight lang="console">
<syntaxhighlight lang="console">
Line 86: Line 117:


== Overriding java jks Certificate Store ==
== Overriding java jks Certificate Store ==
Overriding the java certificate store may be required for adding your own Root certificates in case your company uses an internal PKI or the company utilizes an intercepting proxy.
Overriding the java certificate store may be required for adding your own Root certificates in case your company uses an internal PKI or the company utilizes an intercepting proxy.
=== jdk8 ===
=== jdk8 ===
Overriding the jdk8 certificate store is possible by overriding the '''cacert''' parameter of the package:
Overriding the jdk8 certificate store is possible by overriding the '''cacert''' parameter of the package:


Line 116: Line 150:


=== jdk11 ===
=== jdk11 ===
JDK11 does not provide the cacert overridable and therefore it is not possible to use the same technique to override the truststore.
 
JDK11 does not provide the cacert overridable and therefore it is not possible to use the same technique to override the truststore.
 
As an alternative solution you can either set an environment variable, <code>JAVAX_NET_SSL_TRUSTSTORE</code>, or pass an argument to your program, <code>-Djavax.net.ssl.trustStore</code>, with the location of your cacert. See [https://discourse.nixos.org/t/custom-ssl-certificates-for-jdk/18297/9 discussion].


== Building and Packaging ==
== Building and Packaging ==


see the [https://ryantm.github.io/nixpkgs/languages-frameworks/java/ Java section in the Nixpkgs manual]
See the [https://nixos.org/manual/nixpkgs/#sec-language-java Java section in the Nixpkgs manual].


=== Maven ===
=== Maven ===
Line 128: Line 165:
<pre>mvn verify</pre>
<pre>mvn verify</pre>


[https://github.com/fzakaria/mvn2nix mvn2nix] and [https://github.com/NixOS/nixpkgs/blob/master/pkgs/build-support/build-maven.nix buildMaven] can be used to build Maven projects with Nix
[https://github.com/fzakaria/mvn2nix mvn2nix], [https://nixos.org/manual/nixpkgs/stable/#maven-buildmavenpackage buildMavenPackage] (recommended) can be used to build Maven projects with Nix
 
See also: [https://fzakaria.com/2020/07/20/packaging-a-maven-application-with-nix.html Packaging a Maven application with Nix] and [https://github.com/NixOS/nixpkgs/blob/master/pkgs/by-name/ma/maven/build-maven-package.nix buildMavenPackage source]


=== Ant ===
=== Ant ===
Line 144: Line 183:
[https://ant.apache.org/ivy/ Ivy] is a package manager for Ant, not to be confused with [https://github.com/NixOS/nixpkgs/blob/master/pkgs/development/interpreters/ivy/default.nix ivy] - an APL-like calculator
[https://ant.apache.org/ivy/ Ivy] is a package manager for Ant, not to be confused with [https://github.com/NixOS/nixpkgs/blob/master/pkgs/development/interpreters/ivy/default.nix ivy] - an APL-like calculator


To replace ivy, see for example [https://github.com/NixOS/nixpkgs/blob/master/pkgs/applications/editors/jedit pkgs/applications/editors/jedit]
To fetch ivy sources manually, see for example [https://github.com/NixOS/nixpkgs/blob/master/pkgs/applications/editors/jedit pkgs/applications/editors/jedit]
 
To fetch ivy sources in a fixed-output-derivation, see for example [https://github.com/milahu/nur-packages/blob/master/pkgs/yacy/yacy.nix yacy.nix]
 
== JavaFX and Webkit support ==
 
To include support for JavaFX and Webkit, use the <code>enableJavaFX</code> and <code>withWebKit</code> options:


<syntaxHighlight lang=nix>
{ pkgs, ... }:
let
  jdkWithFX = pkgs.openjdk.override {
    enableJavaFX = true; # for JavaFX
    # include following line if JavaFX with Webkit is needed
    openjfx_jdk = pkgs.openjfx.override { withWebKit = true; };
  };
in
...
</syntaxHighlight>
== Further reading ==
{{Nixpkgs manual|sec-language-java}}<br /><br /><br /><br /><br />{{Wikipedia|Java_(programming_language)}}


[[Category:Applications]]
[[Category:Languages]]
[[Category:Languages]]