https://wiki.archlinux.org/api.php?action=feedcontributions&user=Apache553&feedformat=atom
ArchWiki - User contributions [en]
2024-03-29T00:10:51Z
User contributions
MediaWiki 1.41.0
https://wiki.archlinux.org/index.php?title=Java_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)&diff=681154
Java (简体中文)
2021-06-15T16:05:21Z
<p>Apache553: 修改为更为常见的译名</p>
<hr />
<div>[[Category:Programming languages (简体中文)]]<br />
[[cs:Java]]<br />
[[de:Java]]<br />
[[en:Java]]<br />
[[es:Java]]<br />
[[fa:Java]]<br />
[[fr:Java]]<br />
[[it:Java]]<br />
[[ja:Java]]<br />
[[pt:Java]]<br />
[[ru:Java]]<br />
{{Related articles start}}<br />
{{Related|Java package guidelines (简体中文)}}<br />
{{Related|Java Runtime Environment Fonts}}<br />
{{Related articles end}}<br />
<br />
这是来自 [[Wikipedia:Java (programming language)|维基百科的文章]]:<br />
<br />
:Java是由Sun微系统公司原创开发的编程语言并且在1995年发布,用作Sun微系统公司的Java平台的核心组件。它从C和C++派生了许多语法,但有一个简洁的对象模型和更少的底层组件。Java的应用一般被编译成能在([[Wikipedia:Java virtual machine|JVM]])运行的字节码,并能无视计算机结构。<br />
<br />
Arch Linux官方支持开源的 [https://openjdk.java.net/ OpenJDK] 版本7、8、10和11.所有的JVM都能无冲突的被安装,并切换到帮助脚本{{Ic|archlinux-java}}. 一些其他的Java环境也是可使用的,在 [[Arch User Repository (简体中文)]]中,但官方并不支持。<br />
<br />
== 安装 ==<br />
<br />
{{注意|<br />
* arch Linux官方只支持 [[#OpenJDK|OpenJDK]] 实现.<br />
* 安装之后,Java环境需要被shell({{Ic|$PATH}} 变量)识别. 可以通过命令行用source处理 {{Ic|/etc/profile}} 或者重新登出登入桌面环境.}}<br />
<br />
两个 ''公共'' 包应该被当做依赖分别安装,他们是 {{Pkg|java-runtime-common}} (包含Java运行环境(JRE)的公共文件) 和 {{Pkg|java-environment-common}} (包括Java开发包(JDK)的公共文件). 提供的环境文件 {{Ic|/etc/profile.d/jre.sh}} 指向了一个链接路径 {{Ic|/usr/lib/jvm/default/bin}}, 它被 {{ic|archlinux-java}} 帮助脚本设置. 这个链接 {{Ic|/usr/lib/jvm/default}} 和 {{Ic|/usr/lib/jvm/default-runtime}} 应该 '''总是''' 被 {{Ic|archlinux-java}}编辑. 这用来显示和指向默认运行的Java环境,在{{Ic|<nowiki>/usr/lib/jvm/java-${JAVA_MAJOR_VERSION}-${VENDOR_NAME}</nowiki>}} ,或Java运行,在 {{Ic|<nowiki>/usr/lib/jvm/java-${JAVA_MAJOR_VERSION}-${VENDOR_NAME}/jre</nowiki>}}.<br />
<br />
大多数可执行的Java安装都在直接路径{{Ic|/usr/bin}}里,而其他的在 {{Ic|$PATH}}.<br />
<br />
{{警告|文件 {{Ic|/etc/profile.d/jdk.sh}} 再也不被任何包提供了.}}<br />
<br />
=== OpenJDK ===<br />
<br />
[[Wikipedia:OpenJDK|OpenJDK]] 是一种Java平台、标准版(Java SE)的开源实现(Java SE).<br />
<br />
;Headless JRE: 最小的Java运行环境 - 需要被用来执行非GUI的Java程序.<br />
;Full JRE: 完全的Java运行环境 - 需要用来运行JavaGUI程序,依赖于headless JRE.<br />
;JDK:[[Wikipedia:Java Development Kit|Java Development Kit]] - 需要用来搭建Java开发环境, 依赖于 full JRE.<br />
<br />
{| class="wikitable"<br />
! 版本 !! Headless JRE !! Full JRE !! JDK !! 文献 !! 来源<br />
|-<br />
| [https://openjdk.java.net/projects/jdk/15/ OpenJDK 15] || {{Pkg|jre-openjdk-headless}} || {{Pkg|jre-openjdk}} || {{Pkg|jdk-openjdk}} || {{Pkg|openjdk-doc}} || {{Pkg|openjdk-src}}<br />
|-<br />
| [https://openjdk.java.net/projects/jdk/11/ OpenJDK 11] || {{Pkg|jre11-openjdk-headless}} || {{Pkg|jre11-openjdk}} || {{Pkg|jdk11-openjdk}} || {{Pkg|openjdk11-doc}} || {{Pkg|openjdk11-src}}<br />
|-<br />
| [https://openjdk.java.net/projects/jdk8/ OpenJDK 8] || {{Pkg|jre8-openjdk-headless}} || {{Pkg|jre8-openjdk}} || {{Pkg|jdk8-openjdk}} || {{Pkg|openjdk8-doc}} || {{Pkg|openjdk8-src}}<br />
|-<br />
| [https://openjdk.java.net/projects/jdk7/ OpenJDK 7] || {{Pkg|jre7-openjdk-headless}} || {{Pkg|jre7-openjdk}} || {{Pkg|jdk7-openjdk}} || {{Pkg|openjdk7-doc}} || {{Pkg|openjdk7-src}}<br />
|}<br />
<br />
{{App|IcedTea-Web|Java web第一步 但是是一个被弃用的Java浏览器插件.|https://icedtea.classpath.org/wiki/IcedTea-Web{{Dead link (简体中文)|2021|06|10|status=404}}|{{Pkg|icedtea-web}}}}<br />
{{App|OpenJFX 8|JavaFX的开源实现. 你[https://wiki.openjdk.java.net/display/OpenJFX/Repositories+and+Releases 不需要] 安装这个包,如果你使用Java SE的话 (下面要讲的Oracle的JRE和JDK实现). 这个包仅仅是因为担心Java开源实现的用户 (OpenJDK 项目).|https://openjdk.java.net/projects/openjfx/|{{Pkg|java-openjfx}}, {{Pkg|java-openjfx-doc}}, {{Pkg|java-openjfx-src}}}}<br />
{{App|OpenJDK EA|Oracle的OpenJDK为最新开发版本的早期接入.|https://jdk.java.net|{{AUR|openjdk-devel}}{{Broken package link (简体中文)|package not found}}}}<br />
{{App|OpenJFX EA|Oracle的OpenJFK为最新开发版本的早期接入.|https://jdk.java.net/openjfx/|{{AUR|java-openjfx-devel}}{{Broken package link (简体中文)|package not found}}}}<br />
<br />
=== 其他实现 ===<br />
<br />
{{App|Java SE|Oracle的JRE和JDK实现.|https://www.oracle.com/technetwork/java/javase/downloads/index.html|{{AUR|jre}} {{AUR|jre9}} {{AUR|jre8}} {{AUR|jre7}} {{AUR|jre6}} {{AUR|jdk}} {{AUR|jdk9}} {{AUR|jdk8}} {{AUR|jdk7}} {{AUR|jdk6}} {{AUR|jdk5}} {{AUR|jdk-devel}}}}<br />
{{App|OpenJ9|Eclipse的JRE实现,由IBM贡献|https://www.eclipse.org/openj9/|{{AUR|jdk9-openj9-bin}} {{AUR|jdk8-openj9-bin}}}}<br />
{{App|IBM J9|IBM的第八版Java实现.|https://developer.ibm.com/javasdk/|{{AUR|jdk8-j9-bin}} {{AUR|jdk7-j9-bin}} {{AUR|jdk7r1-j9-bin}}}}<br />
{{App|Parrot VM|一个对Java [http://trac.parrot.org/parrot/wiki/Languages]提供实验支持的虚拟机 ,通过两种方式,一种是 [https://code.google.com/p/parrot-jvm/ Java VM bytecode translator],另一种是[https://github.com/chrisdolan/perk Java compiler targeting the Parrot VM].|http://www.parrot.org/|{{AUR|parrot}}}}<br />
<br />
{{注意|32比特版本的JavaSE可以通过添加前缀 {{ic|bin32-}}来找到,例如 {{AUR|bin32-jre}} 和 {{AUR|bin32-jdk}}{{Broken package link (简体中文)|package not found}}. 他们使用的是 {{AUR|java32-runtime-common}},而这和 {{Pkg|java-runtime-common}}功能一样只要添加后缀就好了{{ic|32}}, 例如. {{ic|java32}}. 同样的方法也适用于 {{AUR|java32-environment-common}},它只用于32比特版本的JDK包.}}<br />
<br />
=== 开发工具 ===<br />
<br />
对于集成开发环境,查阅[[List of applications#Integrated development environments]] 和特定的 ''Java IDEs'' 的子分区<br />
<br />
为了阻止逆向工程,可以使用像{{AUR|proguard}}的混淆器.<br />
<br />
==== 反编译器 ====<br />
<br />
* {{App|Bytecode Viewer|Java逆向工程套件, 包括一个反编译器, 编辑器和调试器.|https://bytecodeviewer.com|{{AUR|bytecode-viewer}}}}<br />
* {{App|CFR|Java反编译器,支持Java 9,10和更高版本的现代功能|https://www.benf.org/other/cfr/|{{AUR|cfr}}}}<br />
* {{App|Fernflower|Java的分析反编译器, 被开发为[[IntelliJ IDEA]]的一部分.|https://github.com/JetBrains/intellij-community/tree/master/plugins/java-decompiler/engine|{{AUR|fernflower-git}}}}<br />
* {{App|[[Wikipedia:JAD (software)|JAD]]|不被维护的Java反编译器.|https://varaneckas.com/jad|{{Pkg|jad}}}}<br />
* {{App|JD-Core-java|[[Wikipedia:Java Decompiler|Java反编译器]的薄包装]].|https://github.com/nviennot/jd-core-java|{{AUR|jd-core-java}}}}<br />
* {{App|Krakatau|Java的反编译器,汇编器和反汇编器.|https://github.com/Storyyeller/Krakatau|{{AUR|krakatau-git}}}}<br />
* {{App|Procyon decompiler|实验性质的Java反编译器, 被ILSpy and Mono.Cecil启发.|https://bitbucket.org/mstrobel/procyon/wiki/Java%20Decompiler|{{AUR|procyon-decompiler}}, GUI: {{AUR|luyten}}}}<br />
<br />
== 在JVM间切换 ==<br />
<br />
帮助脚本 {{Ic|archlinux-java}} 提供了如下功能:<br />
<br />
archlinux-java <COMMAND><br />
<br />
COMMAND:<br />
status List installed Java environments and enabled one<br />
get Return the short name of the Java environment set as default<br />
set <JAVA_ENV> Force <JAVA_ENV> as default<br />
unset Unset current default Java environment<br />
fix Fix an invalid/broken default Java environment configuration<br />
<br />
=== 列出兼容的安装了的Java环境 ===<br />
<br />
$ archlinux-java status<br />
<br />
例如:<br />
<br />
$ archlinux-java status<br />
Available Java environments:<br />
java-7-openjdk (default)<br />
java-8-openjdk/jre<br />
<br />
标着 ''(default)'' 表示 {{Ic|java-7-openjdk}} 被设为默认. {{Ic|java}} 的调用和其他二进制调用都依赖于这个安装的Java.同时前面的输出表示只有OpenJDK8的JRE部分被安装了.<br />
<br />
=== 改变默认Java环境 ===<br />
<br />
# archlinux-java set <JAVA_ENV_NAME><br />
<br />
例如:<br />
<br />
# archlinux-java set java-8-openjdk/jre<br />
<br />
{{Tip|想看可用的 {{ic|<JAVA_ENV_NAME>}} 名字, 使用 {{ic|archlinux-java status}}.}}<br />
<br />
注意到 {{Ic|archlinux-java}} 并不会让你设置一个不可用的Java环境. 在前面的例子中, {{pkg|jre8-openjdk}} 安装了但是 {{pkg|jdk8-openjdk}} 并 '''没有''' 所以尝试设置 {{Ic|java-8-openjdk}} 将会失败:<br />
<br />
# archlinux-java set java-8-openjdk<br />
'/usr/lib/jvm/java-8-openjdk' is not a valid Java environment path<br />
<br />
=== 取消设置的默认Java环境 ===<br />
<br />
没必要取消设置的Java环境因为安装包会让它们注意这种情况. 如果你还想这么做的话,用这条命令 {{Ic|unset}}:<br />
<br />
# archlinux-java unset<br />
<br />
=== 解决默认Java环境的问题 ===<br />
<br />
如果一个不可用的Java环境链接被设置,用 {{Ic|archlinux-java fix}} 命令尝试修复它. 同时如果没有默认Java环境被设置,它会找可用的并尝试为你设置。官方支持的包 "OpenJDK 8" 将会比其他安装的环境被优先考虑.<br />
<br />
# archlinux-java fix<br />
<br />
=== 运行非默认Java版本的程序 ===<br />
<br />
如果你想运行其它版本而不是默认版本的程序(例如你有JRE7和JRE8同时装在系统里), 你可以把你的程序打包进一个小bash脚本里来暂时改变Java的默认版本。例如如果默认版本是JRE7而你想用JRE8:<br />
<br />
#!/bin/sh <br />
<br />
export PATH=/usr/lib/jvm/java-8-openjdk/jre/bin/:$PATH<br />
exec /path/to/application "$@"<br />
<br />
== 包支持{{Ic|archlinux-java}}的先决条件 ==<br />
<br />
{{注意|这条信息同样适用于 {{ic|archlinux32-java}} 的32位比特Java包, 如果它们的包或者可执行名字里有 {{ic|32}} ,都可适用.}}<br />
<br />
这个分区的信息针对愿意提供包作为备份JVM给 [[Arch User Repository (简体中文)]] 的贡献者, 并且能够用 {{Ic|archlinux-java}}集成Arch Linux JVM方案. 如果要这样的话,这些包应该:<br />
<br />
* 把所有文件放在这里 {{Ic|/usr/lib/jvm/java-${JAVA_MAJOR_VERSION}-${VENDOR_NAME} }}<br />
* 确认所有的 [https://archlinux.org/packages/extra/any/java-runtime-common/files/ java-runtime-common] 和 [https://archlinux.org/packages/extra/any/java-environment-common/files/ java-environment-common] 提供的可执行链接在相关包里都是可用的 <br />
* 把所有链接从 {{Ic|/usr/bin}} 移动到可执行文件里, 除非这些链接不属于 [https://archlinux.org/packages/extra/any/java-runtime-common/files/ java-runtime-common] 和 [https://archlinux.org/packages/extra/any/java-environment-common/files/ java-environment-common]<br />
* 用 {{Ic|-${VENDOR_NAME}${JAVA_MAJOR_VERSION} }} 的格式给手册页添加后缀 (查阅 [https://archlinux.org/packages/extra/x86_64/jre8-openjdk/files/ jre8-openjdk file list] 它的手册页用 {{Ic|-openjdk8}}做后缀)<br />
* 不要定义任何 [[PKGBUILD (简体中文)#conflicts|冲突]] 和[[PKGBUILD (简体中文)#replaces|替代]] ,用其他的JDK, {{Ic|java-runtime}}, {{Ic|java-runtime-headless}} 和 {{Ic|java-environment}}<br />
* 在''安装函数'' 里使用{{Ic|archlinux-java}} 脚本来把Java环境设置为默认 '''如果没有其他可用的Java环境准备设置的话''' (即: 这些包不应该 '''强制''' 被装为默认). 查阅 [https://github.com/archlinux/svntogit-packages/blob/packages/java7-openjdk/trunk officially supported Java environment package sources] 做例子<br />
<br />
同时也该注意到:<br />
* 包需要的 '''任何''' Java环境应该声明依赖,和往常一样在 {{Ic|java-runtime}}, {{Ic|java-runtime-headless}} 或者 {{Ic|java-environment}}里声明 <br />
* 包如果需要 '''特定Java提供商''' 应该在相关包里声明依赖。<br />
* OpenJDK 包现在应该声明 {{Ic|1=provides="java-runtime-openjdk=${pkgver}"}} 等. 这能让第三方的包在没有特定版本要求的OpenJDK里声明依赖<br />
<br />
== 故障排除 ==<br />
<br />
=== MySQL ===<br />
<br />
因为JDBC-驱动经常使用URL的端口来建立到数据库的连接, 所以通过 "远程" (i.e., MySQL不会根据默认设置监听端口)的办法应该被考虑,尽管它们可能运行在同一个主机上, 所有, 要用JDBC和MySQL的话你应该启用到MySQL的远程连接,, 在[[MariaDB#Grant remote access]]查询指导.<br />
<br />
=== IntelliJ IDEA ===<br />
<br />
如果你在设置JDK的时候选择了系统的JDK,同时碰到了错误提示 `The selected directory is not a valid home for JDK`,这个时候你需要重新安装一个jdk,在IntelliJ IDEA设置jdk的时候选择新安装的JDK.<br />
<br />
=== 冒充另一个窗口管理器 ===<br />
<br />
你可以使用 {{pkg|wmname}} ,从 [https://tools.suckless.org/x/wmname suckless.org]下载,来使JVM相信你是在运行一个不同的窗口管理器. 这可以解决在窗口管理器发生的Java GUIs渲染问题, 比如说 [[awesome (简体中文)]] 或者 [[Dwm (简体中文)]] 或者 [[Ratpoison (简体中文)]].<br />
<br />
$ wmname LG3D<br />
<br />
你必须在运行了这条命令后重启有问题的程序.<br />
<br />
这个能起作用是因为JVM包含了一个已知的、非重新父母窗口管理器的硬编码名单. 为了最大化反讽效果,一些用户喜欢冒充 {{ic|LG3D}}, 一种非重新父母窗口管理器 [[wikipedia:Project_Looking_Glass|由Sun公司用Java写成]].<br />
<br />
=== 难以辨认的字体 ===<br />
<br />
除了下述的建议 [[#更好的字体渲染]], 可能还是有一些字体难以辨认. 如果是这样的话,有一个很好的机会能用Microsoft的字体. 在[[AUR]]安装{{AUR|ttf-ms-fonts}} .<br />
<br />
=== 一些应用缺少文字 ===<br />
<br />
如果一些应用完全没有文字,你可以用下面的办法[[#建议和技巧]] 它在{{Bug|40871}}里被建议.<br />
<br />
=== 应用未调整WM大小,菜单快速关闭 ===<br />
<br />
标准Java GUI工具包有一个非重新父母窗口管理器的硬编码名单. 如果你使用的不在名单里, 运行一些Java 程序就可能产生一些问题. 最普遍的一个问题是 "灰斑", 这发生在Java程序渲染纯灰色的盒子而不是渲染GUI的时候. 另一个问题是菜单会响应你的点击,但是立马关闭.<br />
<br />
有很多事能帮到忙:<br />
<br />
* 对于 {{Pkg|jre7-openjdk}} 或者 {{Pkg|jre8-openjdk}}, 在 {{ic|/etc/profile.d/jre.sh}}文件里加入一行 {{Ic|1=export _JAVA_AWT_WM_NONREPARENTING=1}} . 然后,用source命令处理 {{ic|/etc/profile.d/jre.sh}} 或者重新登出登录.<br />
* 对于 Oracle 的 JRE/JDK, 用 [https://wiki.haskell.org/Xmonad/Frequently_asked_questions#Using_SetWMName SetWMName.] 然而,当使用{{ic|XMonad.Hooks.EwmhDesktops}}的时候它的作用可能被取消. 这种情况下,添加<br />
<br />
>> setWMName "LG3D"<br />
<br />
到 {{ic|LogHook}} 可以起作用.<br />
<br />
查阅[https://wiki.haskell.org/Xmonad/Frequently_asked_questions#Problems_with_Java_applications.2C_Applet_java_console] 可以获取更多信息.<br />
<br />
=== 当调试JavaFX程序的时候系统卡住 ===<br />
<br />
当你调试JavaFX程序的时候系统卡住了,你可以尝试提供JVM以下选项 {{Ic|1=-Dsun.awt.disablegrab=true}}.<br />
<br />
查阅 https://bugs.java.com/view_bug.do?bug_id=6714678<br />
<br />
=== JavaFX 的 MediaPlayer 构造函数抛出了一个 exception ===<br />
<br />
从JavaFX声音模板里创造 MediaPlayer 类的实例可能会抛出下面的exception (Oracle JDK 和 OpenJDK都会有)<br />
<br />
... (i.e. FXMLLoader construction exceptions) ...<br />
Caused by: MediaException: UNKNOWN : com.sun.media.jfxmedia.MediaException: Could not create player! : com.sun.media.jfxmedia.MediaException: Could not create player!<br />
at javafx.scene.media.MediaException.exceptionToMediaException(MediaException.java:146)<br />
at javafx.scene.media.MediaPlayer.init(MediaPlayer.java:511)<br />
at javafx.scene.media.MediaPlayer.<init>(MediaPlayer.java:414)<br />
at <constructor call><br />
...<br />
<br />
这是JavaFX和Arch Linux库里提供的 {{pkg|ffmpeg}} 构建不兼容的结果.<br />
<br />
解决办法是安装 {{AUR|ffmpeg-compat-55}}.<br />
<br />
查阅 https://www.reddit.com/r/archlinux/comments/70o8o6/using_a_javafx_mediaplayer_in_arch/<br />
<br />
=== Java程序无法打开外部链接 ===<br />
<br />
如果Java程序不能打开链接到, 比如说, 你的浏览器, 安装{{Pkg|gvfs}}.这是 Desktop.Action.BROWSE 方法所必须的. 查阅 [https://bugs.launchpad.net/ubuntu/+source/openjdk-8/+bug/1574879/comments/2]<br />
<br />
== 建议和技巧 ==<br />
<br />
{{注意|这个区里提的建议在所有程序里有用,如果你用的是明确的安装的 (外部) Java 运行的话.一些程序是用个人的 (私有的) Java运行或者是自己的GUI机制, 字体渲染机制, 等等., 这样的话下面写的都不保证能起作用.}}<br />
<br />
大多数Java程序的行为都可以通过向Java运行提供预定义变量来操控. 查阅 [https://bbs.archlinux.org/viewtopic.php?id=72892 this forum post], 一种这样做的方法包括添加下面的行到你的 {{Ic|~/.bashrc}}文件 (或者通过 {{Ic|/etc/profile.d/jre.sh}} 来影响不是通过用source命令处理{{Ic|~/.bashrc}}来运行的程序 , 比如., 用Gnome应用师徒来运行程序):<br />
<br />
export _JAVA_OPTIONS="-D'''<option 1>''' -D'''<option 2>'''..."<br />
<br />
比如,用系统的抗锯齿字体来使swing有GTK的视觉效果和感觉:<br />
<br />
export _JAVA_OPTIONS='-Dawt.useSystemAAFontSettings=on -Dswing.aatext=true -Dswing.defaultlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel'<br />
<br />
=== 更好的字体渲染 ===<br />
<br />
开源和闭源的Java实现都有不合适的抗锯齿字体实现. 这可以通过以下办法来解决: {{Ic|1=-Dawt.useSystemAAFontSettings=on}}, {{Ic|1=-Dswing.aatext=true}}<br />
<br />
查阅 [[Java Runtime Environment fonts]] 来获取更多信息.<br />
<br />
=== 禁止命令行的 'Picked up _JAVA_OPTIONS' 消息 ===<br />
<br />
设置 _JAVA_OPTIONS 环境变量使 java (openjdk) 写入以下形式的stderr消息: 'Picked up _JAVA_OPTIONS=...'. 要在终端中禁止这些消息,可以取消设置shell启动文件中的环境变量,并使用别名java来传递与命令行参数相同的选项:<br />
<br />
_SILENT_JAVA_OPTIONS="$_JAVA_OPTIONS"<br />
unset _JAVA_OPTIONS<br />
alias java='java "$_SILENT_JAVA_OPTIONS"'<br />
<br />
=== GTK 视觉效果和感觉 ===<br />
<br />
如果你的Java程序看起来很丑, 你可能想为swing组件设置默认外表和感觉:<br />
<br />
{{Ic|1=swing.defaultlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel}}.<br />
<br />
一些Java程序坚持用跨平台的金属外表和感觉. 在这些情况下,你可以通过设置下面的属性强制这些app用GTK外表和感觉:<br />
<br />
{{Ic|1=swing.crossplatformlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel}}.<br />
<br />
==== GTK3支持 ====<br />
<br />
在Java的版本9之前, GTK的外观和感觉是与GTK2链接的,但是同时许多更新的桌面程序用的是GTK3. 这种GTK版本间的不兼容性可能打断程序使用Java的GUI插件,因为同一个进程里GTK2和GTK3的混合不被支持 (例如, LibreOffice 5.0). <br />
<br />
从 [https://openjdk.java.net/jeps/283 Java 9]以来, GTK的外观和感觉可以和GTK的版本 {{Ic|2}}, {{Ic|2.2}} 和 {{Ic|3}}一起运行, 默认GTK2. 这可以通过设置下面的属性来覆盖:<br />
<br />
{{Ic|1=jdk.gtk.version=3}}<br />
<br />
=== 更好的2D性能 ===<br />
<br />
切换到基于OpenGL的硬件加速管道会提升2D性能<br />
<br />
export _JAVA_OPTIONS='-Dsun.java2d.opengl=true'<br />
<br />
{{注意|开启这项选项会导致像Jetbrains的IDE这样的软件的UI表现不正常, 让它们的窗口、弹窗和工具栏只画一部分.}}<br />
<br />
=== 非重新父母窗口管理器 / 灰色窗口 / 程序被绘制得不恰当 ===<br />
<br />
非重新父母窗口管理器的用户应该在他们的 {{Ic|.xinitrc}}里设置以下环境变量<br />
<br />
export _JAVA_AWT_WM_NONREPARENTING=1<br />
<br />
不设置这个的话会导致Java程序被绘制得不恰当.<br />
<br />
== 参阅 ==<br />
<br />
* [https://math.hws.edu/javanotes/ Introduction to Programming Using Java]</div>
Apache553