Java
摘自维基百科中的 Java 词条:
- Java是一种编程语言,最初由Sun Microsystems开发,并于1995年作为Sun Microsystems的Java平台的核心组件发布。它有很多语法来自C和C++,但对象模型更简洁,底层组件更少。Java的应用一般会编译成能在任何Java虚拟机(JVM)而不是特定架构上运行的字节码。
Arch Linux 官方支持开源的 OpenJDK 版本 8、11、17 和 21 — 长期支持 (LTS) 版本,以及 23 — 最新发布的版本。所有这些JVM可以并存,并能够通过帮助脚本 archlinux-java(随 java-runtime-common包 包安装)切换。在 AUR 中也有一些不受官方支持的Java环境。
安装[编辑 | 编辑源代码]
两个常见的包分别作为依赖被拉取,分别是 java-runtime-common包(包含 Java 运行环境 的公共文件)和 java-environment-common包(包含 Java 开发工具包 的公共文件)。
提供的 /etc/profile.d/jre.sh
和 /etc/profile.d/jre.csh
文件指向由 archlinux-java 帮助脚本设置的链接 /usr/lib/jvm/default/bin
。
/usr/lib/jvm/default
和 /usr/lib/jvm/default-runtime
符号链接应始终使用 archlinux-java
进行编辑,该工具用于显示并指向一个可用的默认 Java 运行环境。大多数 Java 安装的可执行文件通过直接链接在 /usr/bin/
中提供,而其他可执行文件则在 $PATH
指向的位置处。
OpenJDK[编辑 | 编辑源代码]
OpenJDK是Java平台标准版(Java SE)的开源实现,也是官方的参考实现。有几个OpenJDK构建的分发,如Adoptium(以前称为AdoptOpenJDK)和Amazon Corretto。Arch Linux的OpenJDK包由上游的OpenJDK源代码构建。
- Headless JRE
- Java的最小运行环境 - 执行非GUI的Java程序所需。
- Full JRE
- 完全的Java运行环境 - 执行Java GUI程序所需。
- JDK
- Java Development Kit - Java开发所需。
JDK、full JRE 和 headless JRE 互相冲突,因为较小的包是其子集:
- JDK 冲突并提供 full JRE,
- full JRE 冲突并提供 headless JRE。
IcedTea-Web — Java Web Start 和已弃用的 Java 浏览器插件。
- https://icedtea.classpath.org/download/icedtea-web-docs/1.8/html/en/icedtea-web.html || icedtea-web包
OpenJDK EA — Oracle 最新的 OpenJDK 开发版Early-Access构建版本。
OpenJDK GA — Oracle 最新的 OpenJDK 通用可用版本发布构建。
OpenJDK Wakefield — JDK 在 Linux 上对 Wayland 桌面环境(WIP)支持。
OpenJFX[编辑 | 编辑源代码]
OpenJFX 是 JavaFX 的开源实现。如果您使用的是 Oracle JDK,则无需安装此软件包。此软件包只适用于 Java 的开源实现(OpenJDK 项目)及其衍生产品的用户。
版本 | 运行环境与开发工具 | 文档 | 源码 |
---|---|---|---|
OpenJFX 22 | java-openjfxAUR | java-openjfx-docAUR | java-openjfx-srcAUR |
OpenJFX 21 | java21-openjfxAUR | java21-openjfx-docAUR | java21-openjfx-srcAUR |
OpenJFX 17 | java17-openjfxAUR | java17-openjfx-docAUR | java17-openjfx-srcAUR |
OpenJFX 11 | java11-openjfxAUR | java11-openjfx-docAUR | java11-openjfx-srcAUR |
OpenJFX 8 | java8-openjfxAUR | java8-openjfx-docAUR | java8-openjfx-srcAUR |
其他实现[编辑 | 编辑源代码]
- AWS Corretto — Amazon Web Services 的 OpenJDK 发行版。
- https://aws.amazon.com/corretto/ || amazon-corretto-8AUR amazon-corretto-11AUR amazon-corretto-17AUR amazon-corretto-21-binAUR
- Azul JDK — Azul 的 JDK 实现。请注意,Azul Zulu Builds of OpenJDK 是开源的,而 Azul Zulu Prime Builds of OpenJDK 是商业产品,免费用于开发和评估。
- https://www.azul.com/downloads/ ||
- Zulu: zulu-8-binAUR zulu-11-binAUR zulu-17-binAUR zulu-21-binAUR
- Zulu Prime: jdk17-zulu-prime-binAUR
- Eclipse Adoptium/Temurin — Eclipse 的 JRE/JDK 实现,基于 Hotspot JVM(前身为 AdoptOpenJDK)。请注意,JRE 被称为 Eclipse Temurin。
- https://adoptium.net/ || jdk-temurinAUR jdk17-temurinAUR jdk11-temurinAUR
- IBM Certified — IBM Semeru Runtime Certified Edition。
- IBM J9 — IBM 的 JRE 实现,使用 OpenJ9 贡献。
- https://www.ibm.com/support/pages/java-sdk-downloads || jdk8-j9-binAUR jdk7-j9-binAUR jdk7r1-j9-binAUR
- Liberica JDK — BellSoft 的 Liberica JDK 实现。
- https://bell-sw.com/libericajdk/ || liberica-jre-8-full-binAUR liberica-jdk-8-full-binAUR liberica-jre-11-binAUR liberica-jre-11-full-binAUR liberica-jdk-11-binAUR liberica-jdk-11-full-binAUR liberica-jdk-17-full-binAUR liberica-jdk-21-full-binAUR
- Microsoft OpenJDK — Microsoft 的 OpenJDK 发行版。
- https://www.microsoft.com/openjdk/ || microsoft-openjdk-11-binAUR microsoft-openjdk-17-binAUR microsoft-openjdk-21-binAUR
- OpenJ9 — Eclipse 的 JRE/JDK 实现,基于 J9 JVM,由 IBM 贡献。
- https://www.eclipse.org/openj9/ || jdk-openj9-binAUR jdk17-openj9-binAUR jdk11-openj9-binAUR jdk8-openj9-binAUR
- Oracle JDK — Oracle 的商业许可的 OpenJDK 构建。请注意,某些版本只能通过手动下载获得,这需要签署 OTN 协议并创建 Oracle 账户。
- https://www.oracle.com/java/technologies/downloads/ ||
- JRE: jreAUR jre-ltsAUR jre11AUR jre8AUR jre7AUR
- JDK: jdkAUR jdk-ltsAUR jdk11AUR jdk8AUR jdk7AUR
bin32-
找到,例如 bin32-jreAUR。它们使用 java32-runtime-commonAUR,其功能与 java-runtime-common包 相同,但添加了 32
的后缀,例如 java32
。java32-environment-commonAUR 也是同理,只有 32 位的 JDK 包使用它。开发工具[编辑 | 编辑源代码]
对于集成开发环境,见List of applications/Utilities#Integrated development environments 和 Java IDEs 子分区。
为了阻止逆向工程,可以使用proguardAUR等混淆器。
反编译器[编辑 | 编辑源代码]
- CFR — Java decompiler, supporting modern features of Java 9, 10 and beyond.
- Fernflower — Analytical decompiler for Java, developed as part of IntelliJ IDEA.
- https://github.com/JetBrains/intellij-community/tree/master/plugins/java-decompiler/engine || fernflower-gitAUR
- Vineflower — Java decompiler forked from Fernflower, aiming to improve code quality. Also available as an IntelliJ IDEA plugin.
- Krakatau — Java decompiler, assembler, and disassembler.
- Procyon decompiler — Experimental Java decompiler, inspired by ILSpy and Mono.Cecil.
- Java Decompiler (JD-Core) — Popular Java decompiler providing a GUI (see JD-GUI) and supporting Java 1-10.
- Jadx — Android DEX to Java decompiler with an optional GUI (see Jadx-GUI).
- JAD — Unmaintained Java decompiler (last release 2006).
GUI前端[编辑 | 编辑源代码]
- Bytecode Viewer — Java reverse engineering suite, including a decompiler, editor and debugger; Frontend for CFR/Fernflower/Procyon.
- Recaf — An easy to use modern Java bytecode editor that abstracts away the complexities of Java programs; Frontend for CFR/Fernflower/Procyon.
- Java Decompiler (JD-GUI) — Popular Java decompiler providing a GUI and supporting Java 1-10; Frontend for JD-Core.
- Jadx-GUI — Android APK DEX to Java decompiler with an optional GUI; Frontend for Jadx.
- Luyten — An Open Source Java Decompiler Gui; Frontend for Procyon.
- https://github.com/deathmarine/Luyten || luytenAUR== 在JVM间切换 ==
帮助脚本 archlinux-java (软件包: java-runtime-common包) 提供了如下功能:
archlinux-java <COMMAND> COMMAND: status 列出已安装的 Java 环境及当前启用的环境 get 返回设置为默认的 Java 环境的短名称 set <JAVA_ENV> 强制将 <JAVA_ENV> 设置为默认 unset 取消当前默认的 Java 环境 fix 修复无效/损坏的默认 Java 环境配置
列出兼容的安装了的Java环境[编辑 | 编辑源代码]
$ archlinux-java status
例如:
$ archlinux-java status Available Java environments: java-11-openjdk (default) java-8-openjdk/jre
这里的(default)
表示目前默认使用java-11-openjdk
,Java和其他二进制文件的调用都将依赖于此Java安装。前面的输出中也显示,这里只安装了OpenJDK 8的JRE部分。
改变默认Java环境[编辑 | 编辑源代码]
# archlinux-java set <JAVA_ENV_NAME>
例如:
# archlinux-java set java-8-openjdk/jre
<JAVA_ENV_NAME>
名称,请使用archlinux-java status
。注意,archlinux-java
不会允许您设置无效的Java环境。在前面的例子中,只安装了jre8-openjdk包,而没有安装jdk8-openjdk包,所以设置java-8-openjdk
将会失败:
# archlinux-java set java-8-openjdk
'/usr/lib/jvm/java-8-openjdk' is not a valid Java environment path
取消设置的默认Java环境[编辑 | 编辑源代码]
无需取消Java环境的设置,因为提供环境的软件包通常会考虑到这一点。但若想这样做,只需使用unset
命令:
# archlinux-java unset
解决默认Java环境的问题[编辑 | 编辑源代码]
如果设置了一个无效的Java环境链接,尝试调用archlinux-java fix
命令以修复它。还要注意,如果没有设置默认的Java环境,它将寻找有效的环境并尝试设置。它会优先考虑官方支持的软件包"OpenJDK 8"。
# archlinux-java fix
运行非默认Java版本的程序[编辑 | 编辑源代码]
如果想用另一个版本的Java启动一个程序(例如系统同时安装了Java 18—默认版本—和11,而您要使用Java 11),可以用一个shell脚本包装应用程序,在本地改变Java的默认路径:
#!/bin/sh export PATH="/usr/lib/jvm/java-11-openjdk/bin/:$PATH" exec /path/to/application "$@"
对于systemd服务,您可以在drop-in file中附加JAVA_HOME
到环境变量:
/etc/systemd/system/unit.d/override.conf
[Service] Environment=JAVA_HOME=/usr/lib/jvm/java-11-openjdk
软件包支持 archlinux-java 的先决条件[编辑 | 编辑源代码]
archlinux32-java
的32位Java包,如果它们的包或者可执行名字里有 32
,都可适用。这个分区的信息针对愿意提供包作为备份JVM给 AUR 的贡献者,并且能够用 archlinux-java
集成Arch Linux JVM方案(即:与 archlinux-java
兼容)。如果要这样的话,这些包应该:
- 把所有文件放在
/usr/lib/jvm/java-${JAVA_MAJOR_VERSION}-${VENDOR_NAME
} - 确认所有的 java-runtime-common包 和 java-environment-common包 提供的可执行链接在相关包里都可用
- 把所有链接从
/usr/bin
移动到可执行文件里,除非这些链接不属于 java-runtime-common包 和 java-environment-common包 - 用
-${VENDOR_NAME}${JAVA_MAJOR_VERSION}
的格式给手册页添加后缀以防止冲突(查阅 jre8-openjdk包 文件列表,它的手册页用-openjdk8
做后缀) - 不要定义任何冲突和替代,用其他的JDK,
java-runtime
,java-runtime-headless
和java-environment
- 在安装函数里使用
archlinux-java
脚本以将Java环境设置为默认如果没有其他可用的Java环境准备设置的话(即:这些包不应该强制被装为默认)。查阅 官方支持的Java环境包源码 做例子
同时也要注意:
- 包需要的任何Java环境都应声明依赖,和通常一样在
java-runtime
、java-runtime-headless
或java-environment
里声明。 - 包如果需要特定的Java提供商,应该在相关包里声明依赖。
- OpenJDK 包现在应该声明
provides="java-runtime-openjdk=${pkgver}"
等。这能让第三方的包在没有特定版本要求的OpenJDK里声明依赖== 疑难解答 ==
MySQL[编辑 | 编辑源代码]
由于JDBC-drivers经常使用URL中的端口来建立与数据库的连接,它被认为是 “远程”的(即MySQL不会按照其默认设置监听该端口),尽管它们可能运行在同一台主机上,因此,若要使用JDBC和MySQL,应按照MariaDB#Grant remote access中的说明,启用对MySQL的远程访问。
IntelliJ IDEA[编辑 | 编辑源代码]
如果在设置JDK的时候选择了系统的JDK,同时碰到了错误提示The selected directory is not a valid home for JDK
,此时应重新安装另一个JDK包,并在IDEA设置中选择它。
伪装成另一个窗口管理器[编辑 | 编辑源代码]
可以使用suckless.org中的wmname包来使JVM相信其正运行于其它窗口管理器。这也许能解决在Awesome或Dwm或Ratpoison等窗口管理器中出现的Java GUI渲染问题。这种做法能够有效,是因为JVM包含了一个已知的、non-re-parenting窗口管理器的硬编码列表。为了达到最大的讽刺效果,一些用户喜欢伪装成LG3D
,这是由Sun用Java编写的non-re-parenting窗口管理器Project Looking Glass。尝试设置compiz
、Metacity
或LG3D
:
$ wmname 窗口管理器名称
运行了这条命令后,必须重启有问题的程序。
另外,可以使用javaagent JavaMatePatch,它是在MATE中设置WM名称并解决Java Swing应用程序在全屏启动时工作不正常的bug的工具。在Java选项中添加-javaagent:JavaMatePatch-1.0.0-SNAPSHOT.jar=窗口管理器名称
来使用它。
字体难以辨认[编辑 | 编辑源代码]
除了下面#更好的字体渲染中的建议,有些字体可能依然难以辨认。使用微软的字体或许能有所改善,安装ttf-ms-fontsAUR即可。
某些应用没有文字[编辑 | 编辑源代码]
如果某些应用完全没有文字,使用FS#40871中建议的#提示和技巧下的选项可能会有所帮助。
灰色窗口/应用不随窗口管理器调整大小/菜单自动关闭[编辑 | 编辑源代码]
标准的Java GUI工具包有一个non-re-parenting窗口管理器的硬编码列表,如果使用不在该列表中的窗口管理器,在运行某些Java应用时可能会有问题。最常见的问题之一是Java应用渲染成了一个灰色盒子而不是GUI。另一个问题是菜单能够响应点击,但马上又会关闭。
以下内容也许有所帮助:
- 见#伪装成另一个窗口管理器。
- 设置
_JAVA_AWT_WM_NONREPARENTING=1
环境变量。 - 对于较新的版本,设置
AWT_TOOLKIT=MToolkit
环境变量。 - 对于xmonad,使用SetWMName。然而,当同时使用
XMonad.Hooks.EwmhDesktops
时,其效果可能会被取消。这种情况下,在LogHook
中添加>> setWMName "LG3D"
可能会有帮助。
更多信息,请参阅Java应用程序问题,Applet java控制台。
调试JavaFX应用时系统卡住[编辑 | 编辑源代码]
如果调试JavaFX应用时系统卡住了,可以尝试提供JVM选项-Dsun.awt.disablegrab=true
。
见[1]。
JavaFX's MediaPlayer constructor throws an exception[编辑 | 编辑源代码]
从JavaFX的声音模块中创建MediaPlayer类的实例可能会产生以下异常(Oracle JDK和OpenJDK都是如此):
... (i.e. FXMLLoader construction exceptions) ... Caused by: MediaException: UNKNOWN : com.sun.media.jfxmedia.MediaException: Could not create player! : com.sun.media.jfxmedia.MediaException: Could not create player! at javafx.scene.media.MediaException.exceptionToMediaException(MediaException.java:146) at javafx.scene.media.MediaPlayer.init(MediaPlayer.java:511) at javafx.scene.media.MediaPlayer.<init>(MediaPlayer.java:414) at <constructor call> ...
这是因为JavaFX和Arch Linux仓库中的ffmpeg包构建不兼容。
安装ffmpeg-compat-55AUR以解决问题。如果ffmpeg-compat-55AUR无法构建,可以尝试安装ffmpeg3.4AUR。
见[2]。
Java程序无法打开外部链接[编辑 | 编辑源代码]
如果Java应用无法将链接打开到浏览器等应用,请安装gvfs包,因为Desktop.Action.BROWSE
办法依赖于它。见[3]。
如果应用程序打印错误消息java.lang.UnsupportedOperationException: The BROWSE action is not supported on the current platform!
,这通常是此问题的明确指示。
Error initializing QuantumRenderer: no suitable pipeline found[编辑 | 编辑源代码]
可能的问题和解决方法:
- 没有GTK2。安装gtk2包。
- 没有OpenJFX。安装java-openjfxAUR。
提示和技巧[编辑 | 编辑源代码]
大多数Java应用的行为都可以通过向Java运行时提供预定义变量来控制。从这个论坛帖子来看,一种方法是在~/.bash_profile
中添加以下一行 (或在/etc/profile.d/jre.sh
添加来影响那些不通过~/.bash_profile
运行的程序):
export _JAVA_OPTIONS="-D<option 1> -D<option 2>..."
例如,使用系统抗锯齿字体并使swing使用GTK的外观与体验(look and feel):
export _JAVA_OPTIONS='-Dawt.useSystemAAFontSettings=on -Dswing.aatext=true -Dswing.defaultlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel'
存在三个这样的变量,在下表中解释的选项优先考虑。
JAVA_TOOL_OPTIONS | 影响应用程序以及javac、jshell等工具。 |
JDK_JAVA_OPTIONS | 影响通过java命令启动的一切应用程序,需要Java 9。 |
(命令行选项) | 在 "class name"参数前指定的参数是Java选项。 |
_JAVA_OPTIONS | 旧方法,影响应用程序和工具。 |
更好的字体渲染[编辑 | 编辑源代码]
开源和闭源的Java实现都有不合适的抗锯齿字体实现。这可以通过以下办法来解决: -Dawt.useSystemAAFontSettings=on
,-Dswing.aatext=true
详见Java Runtime Environment fonts。
禁止命令行里的 'Picked up _JAVA_OPTIONS' 消息[编辑 | 编辑源代码]
设置 JDK_JAVA_OPTIONS 环境变量会使Java(openjdk)向stderr写出以下形式的信息:'Picked up JDK_JAVA_OPTIONS=...'。为了禁止终端中显示这些信息,可以在~/.bashrc
中取消设置环境变量,并alias java,将这些选项传递为命令行参数:
_SILENT_JAVA_OPTIONS="$_JAVA_OPTIONS" unset _JAVA_OPTIONS alias java='java "$_SILENT_JAVA_OPTIONS"'
非交互式的Shell,如Java程序的启动脚本,(通常)不读取~/.bashrc
,但仍从其父进程中继承了导出的变量(而父进程又在某个时间从读取了~/.bash_profile
的登录Shell中继承了它)。
至于这种情况,一般会在~/.bashrc
的开头放一个声明,以避免读取文件。这样变量就会传递到通过桌面菜单启动的程序,如果是交互式Shell,则会使用alias来代替(这则不能用于脚本)。
GTK LookAndFeel(外观与体验)[编辑 | 编辑源代码]
如果你的Java程序看起来很丑,你可能想为swing组件设置默认外观与体验:
swing.defaultlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel
一些Java程序坚持用跨平台的金属风格外观与体验。在这些情况下,你可以通过设置下面的属性强制这些app用GTK外观和外观:
swing.crossplatformlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel
GTK3支持[编辑 | 编辑源代码]
在Java 9以前,GTK LookAndFeel是针对GTK2链接的,而许多较新的桌面应用程序使用GTK3。这种GTK版本之间的不兼容可能会破坏使用Java插件的GUI应用程序,因为在Java不支持在同一进程中混合使用GTK2和GTK3(如LibreOffice 5.0)。
GTK LookAndFeel可以针对GTK2
、2.2
和3
运行,默认为GTK3。可以通过设置以下属性来调整:
jdk.gtk.version=3
HiDPI[编辑 | 编辑源代码]
根据GUI框架的不同,HiDPI#Java applications可以使用不同的方法启用。