12

我想在我的系统上包含 Java GUI 支持,它只支持 wayland 后端。我试图包含 OpenJDK-7-jre 包,但它似乎具有 X11 依赖项。我成功编译了“Openjre-8”包并包含在我的图像中。但是,它只能运行没有 GUI 的 Java 应用程序。当我尝试运行任何基于 JAVA SWING API 的 GUI 程序时,我收到以下错误:

Exception in thread "main" java.awt.HeadlessException                           
        at java.awt.GraphicsEnvironment.checkHeadless(Unknown Source)           
        at java.awt.Window.<init>(Unknown Source)                               
        at java.awt.Frame.<init>(Unknown Source)                                
        at java.awt.Frame.<init>(Unknown Source)                                
        at javax.swing.JFrame.<init>(Unknown Source)                            
        at GuiApp1.<init>(GuiApp1.java:25)                                      
        at GuiApp1.main(GuiApp1.java:20)  

是否可以在 Wayland 上运行 Java GUI 程序?我们该怎么做呢?

4

4 回答 4

6

我在想同样的事情时发现了这个问题:我有一个 Java Swing 应用程序,我想在 Wayland 上本地运行。我不知道这是否可能,并且缺乏其他答案似乎表明它不是。

但是,您绝对可以在 XWayland 下运行 Swing 应用程序,并在您首选的 Wayland 合成器下运行它。您可能会发现这足以满足您的需求。至少在 GNOME 3 合成器下的初始测试中,它对我来说效果很好。

编辑:继续我的搜索,我发现 Wayland 社区在他们的邮件列表中以同样的方式回答了你的问题,以及额外的上下文。为了避免其他读者的麻烦,这篇文章总结了截至 2016 年 8 月的情况:https ://lists.freedesktop.org/archives/wayland-devel/2016-August/030832.html

于 2016-09-30T06:25:54.540 回答
1

这有点可能。AWT 代表“抽象”窗口工具包。AWT 有几个扩展,其中对等点是 QT 或 GTK,而不是默认的 JDK。

Qt: https ://cvs.savannah.gnu.org/viewvc/classpath/classpath/gnu/java/awt/peer/qt/

gtk: https ://cvs.savannah.gnu.org/viewvc/classpath/classpath/gnu/java/awt/peer/gtk/

请注意,这些源代码很旧,可能需要进行一些修改才能与最新的 JDK 一起使用。

于 2020-09-13T16:40:13.193 回答
1

我使用作为对另一个答案的评论发布的 cacio-wayland @Zubzub 解决了这个问题。

由于我想使用的程序(IntelliJ IDEA)需要 JDK >=11,我不得不对 cacio-shared 子目录进行一些更改,并相应地调整 cacio-wayland 以在 JDK11 上运行:

https://github.com/petabyteboy/caciocavallo/commit/81d3254699f6caaa1e9957cae47703e0b18de870

您可以克隆我的存储库,构建库并使用它们来启动您的应用程序。在本例中,我启动 JD-GUI:

# make sure you have the following things installed: openjdk jdk11, cairo, wayland, libxkbcommon, maven, git

git clone https://github.com/petabyteboy/caciocavallo
cd caciocavallo

mvn clean install
# it may fail to generate javadocs, but as long as cacio-wayland/target/cacio-wayland-1.10-SNAPSHOT.jar is generated it should be fine

# the generated native library needs to be renamed to be found at runtime
mkdir natives
cp cacio-wayland/target/nar/cacio-wayland-1.10-SNAPSHOT-amd64-Linux-gpp-jni/lib/amd64-Linux-gpp/jni/libcacio-wayland-1.10-SNAPSHOT.so natives/libcacio-wayland.so

java \
  -cp $PWD/cacio-shared/target/cacio-shared-1.10-SNAPSHOT.jar:$PWD/cacio-wayland/target/cacio-wayland-1.10-SNAPSHOT.jar:/usr/share/jd-gui/jd-gui-1.6.6.jar \
  -Dawt.toolkit=net.java.openjdk.cacio.wayland.WaylandToolkit \
  -Djava.awt.graphicsenv=net.java.openjdk.cacio.wayland.WaylandGraphicsEnvironment  \
  -Djava.library.path=$PWD/natives \
  org.jd.gui.App

如果它在您的 Wayland 合成器中导致 SIGSEGV 崩溃,请尝试使用 Weston。

于 2021-02-23T12:24:12.830 回答
0

我使用 cacio-wayland 在 Wayland 上运行想法,但在 HiDPI 中仍然模糊。并且需要一些步骤来运行:

  1. 使用idea目录中的jbr作为java运行时构建
  2. 修复一些构建错误:
    • cacio-shared/src/main/java/sun/awt/peer/cacio/KFMHelper.java : shouldNativelyFocusHeavyweight 添加最后一个参数
    • cacio-wayland/pom.xml : 修复 include/lib 路径
    • pom.xml :将 maven-install-plugin 版本更改为 3.0.0-M1
  3. 修复运行时错误:cacio-wayland/src/main/native/wayland.c : display_handle_mode
// is current mode
if ((flags & 0x1) == 0x1) {
  if (width > _display.width)
    _display.width = width;
  if (height > _display.height)
    _display.height = height;
}

获取最大显示大小以创建池,避免错误:wl_shm_pool 无效宽度、高度或步幅

于 2021-11-27T13:38:25.060 回答