1# This module provides JAVA_HOME, with a different way to install java
2# system-wide.
3
4{ config, lib, pkgs, ... }:
5
6with lib;
7
8let
9 cfg = config.programs.java;
10in
11{
12
13 options = {
14
15 programs.java = {
16
17 enable = mkEnableOption (lib.mdDoc "java") // {
18 description = lib.mdDoc ''
19 Install and setup the Java development kit.
20
21 ::: {.note}
22 This adds JAVA_HOME to the global environment, by sourcing the
23 jdk's setup-hook on shell init. It is equivalent to starting a shell
24 through 'nix-shell -p jdk', or roughly the following system-wide
25 configuration:
26
27 environment.variables.JAVA_HOME = ''${pkgs.jdk.home}/lib/openjdk;
28 environment.systemPackages = [ pkgs.jdk ];
29 :::
30 '';
31 };
32
33 package = mkOption {
34 default = pkgs.jdk;
35 defaultText = literalExpression "pkgs.jdk";
36 description = lib.mdDoc ''
37 Java package to install. Typical values are pkgs.jdk or pkgs.jre.
38 '';
39 type = types.package;
40 };
41
42 binfmt = mkEnableOption (lib.mdDoc "binfmt to execute java jar's and classes");
43
44 };
45
46 };
47
48 config = mkIf cfg.enable {
49
50 boot.binfmt.registrations = mkIf cfg.binfmt {
51 java-class = {
52 recognitionType = "extension";
53 magicOrExtension = "class";
54 interpreter = pkgs.writeShellScript "java-class-wrapper" ''
55 test -e ${cfg.package}/nix-support/setup-hook && source ${cfg.package}/nix-support/setup-hook
56 classpath=$(dirname "$1")
57 class=$(basename "''${1%%.class}")
58 $JAVA_HOME/bin/java -classpath "$classpath" "$class" "''${@:2}"
59 '';
60 };
61 java-jar = {
62 recognitionType = "extension";
63 magicOrExtension = "jar";
64 interpreter = pkgs.writeShellScript "java-jar-wrapper" ''
65 test -e ${cfg.package}/nix-support/setup-hook && source ${cfg.package}/nix-support/setup-hook
66 $JAVA_HOME/bin/java -jar "$@"
67 '';
68 };
69 };
70
71 environment.systemPackages = [ cfg.package ];
72
73 environment.shellInit = ''
74 test -e ${cfg.package}/nix-support/setup-hook && source ${cfg.package}/nix-support/setup-hook
75 '';
76
77 };
78
79}