Java: Difference between revisions
imported>Volth |
→jdk11: alternatives to overriding cacert for jdk11+ |
||
(31 intermediate revisions by 15 users not shown) | |||
Line 2: | Line 2: | ||
__TOC__ | __TOC__ | ||
== Java Web Start == | |||
Available as <code>javaws</code> in package <code>adoptopenjdk-icedtea-web</code>. | |||
== JDK options == | == JDK options == | ||
Your default choice should probably be to install <code> | 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> | ** <code>jdk8[_headless]</code> for a legacy Java 8 VM required by some older apps | ||
** <code> | ** <code>jdk21[_headless]</code>, the currently-supported LTS version of OpenJDK | ||
** <code> | ** <code>jdk22[_headless]</code>, the current version of OpenJDK | ||
* AdoptOpenJDK, prebuilt binaries for OpenJDK | * Temurin, formerly AdoptOpenJDK, prebuilt binaries for OpenJDK | ||
** <code> | ** <code>temurin-bin</code> points to the latest version of Temurin, which is version 21 at the time of writing. | ||
** <code> | ** <code>temurin-jre-bin</code> is available if you want to avoid downloading the compiler and only require the runtime environment. | ||
* 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> | 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 35: | 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 43: | Line 79: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Working with | 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"> | ||
let | nixpkgs.overlays = let | ||
files = { | files = { | ||
"jdk-8u241-linux-linux-arm32-vfp-hflt.tar.gz" = /home/user/blobs/java/jdk-8u241-linux-linux-arm32-vfp-hflt.tar.gz; | "jdk-8u241-linux-linux-arm32-vfp-hflt.tar.gz" = /home/user/blobs/java/jdk-8u241-linux-linux-arm32-vfp-hflt.tar.gz; | ||
Line 53: | Line 89: | ||
"jdk-8u241-linux-x64.tar.gz" = /home/user/blobs/java/jdk-8u241-linux-x64.tar.gz; | "jdk-8u241-linux-x64.tar.gz" = /home/user/blobs/java/jdk-8u241-linux-x64.tar.gz; | ||
}; | }; | ||
in | in [ | ||
(self: super: { | (self: super: { | ||
requireFile = args @ {name, url, sha1 ? null, sha256 ? null}: | requireFile = args @ {name, url, sha1 ? null, sha256 ? null}: | ||
Line 61: | Line 96: | ||
inherit name; | inherit name; | ||
outputHashMode = "flat"; | outputHashMode = "flat"; | ||
outputHashAlgo = if sha256 | outputHashAlgo = if sha256 != null then "sha256" else "sha1"; | ||
outputHash = if sha256 | outputHash = if sha256 != null then sha256 else sha1 ; | ||
buildCommand = "cp ${files.${name}} $out"; | buildCommand = "cp ${files.${name}} $out"; | ||
} | } | ||
Line 73: | Line 108: | ||
== Better font rendering== | == Better font rendering== | ||
By default java does not enable | 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 82: | 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 112: | 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 == | |||
See the [https://nixos.org/manual/nixpkgs/#sec-language-java Java section in the Nixpkgs manual]. | |||
=== Maven === | |||
[https://maven.apache.org/run.html Maven] is a build tool for Java. The typical build command is | |||
<pre>mvn verify</pre> | |||
[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 === | |||
[https://ant.apache.org/manual/running.html Ant] is a build tool for Java. To build the <code>compile</code> target, run | |||
<pre>ant compile</pre> | |||
To list available build targets, run | |||
<pre>ant -p</pre> | |||
==== Ivy ==== | |||
[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 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:Languages]] |