首页 > 解决方案 > 通过 GTK 的 jar 在 Java 中创建 gnome GUI:CLASSPATH 问题

问题描述

我试图运行一个简单的 java-gnome 窗口。

我遵循示例代码中的代码步骤


import org.gnome.gdk.Event;
import org.gnome.gtk.Gtk;
import org.gnome.gtk.Widget;
import org.gnome.gtk.Window;
import org.gnome.gtk.WindowPosition;

public class GdkSimple extends Window {
    public GdkSimple() {
        setTitle("Example");
        connect((DeleteEvent)(source, event) -> {
            Gtk.mainQuit();
            return false;
        });
        setDefaultSize(250, 150);
        setPosition(WindowPosition.CENTER);
        show();
    }

    public static void main(String[] args) {
        Gtk.init(args);
        new GdkSimple(); 
        Gtk.main(); 
    } 
}

我觉得我错过了一些非常基本的东西。我正在使用ideaJ。我可以使用此命令通过 IDE 运行代码

 java -classpath /home/theUser/.sdkman/candidates/java/java8u202/jre/lib/charsets.jar:/home/theUser/.sdkman/candidates/java/java8u202/jre/lib/deploy.jar:/home/theUser/.sdkman/candidates/java/java8u202/jre/lib/ext/cldrdata.jar:/home/theUser/.sdkman/candidates/java/java8u202/jre/lib/ext/dnsns.jar:/home/theUser/.sdkman/candidates/java/java8u202/jre/lib/ext/jaccess.jar:/home/theUser/.sdkman/candidates/java/java8u202/jre/lib/ext/jfxrt.jar:/home/theUser/.sdkman/candidates/java/java8u202/jre/lib/ext/localedata.jar:/home/theUser/.sdkman/candidates/java/java8u202/jre/lib/ext/nashorn.jar:/home/theUser/.sdkman/candidates/java/java8u202/jre/lib/ext/sunec.jar:/home/theUser/.sdkman/candidates/java/java8u202/jre/lib/ext/sunjce_provider.jar:/home/theUser/.sdkman/candidates/java/java8u202/jre/lib/ext/sunpkcs11.jar:/home/theUser/.sdkman/candidates/java/java8u202/jre/lib/ext/zipfs.jar:/home/theUser/.sdkman/candidates/java/java8u202/jre/lib/javaws.jar:/home/theUser/.sdkman/candidates/java/java8u202/jre/lib/jce.jar:/home/theUser/.sdkman/candidates/java/java8u202/jre/lib/jfr.jar:/home/theUser/.sdkman/candidates/java/java8u202/jre/lib/jfxswt.jar:/home/theUser/.sdkman/candidates/java/java8u202/jre/lib/jsse.jar:/home/theUser/.sdkman/candidates/java/java8u202/jre/lib/management-agent.jar:/home/theUser/.sdkman/candidates/java/java8u202/jre/lib/plugin.jar:/home/theUser/.sdkman/candidates/java/java8u202/jre/lib/resources.jar:/home/theUser/.sdkman/candidates/java/java8u202/jre/lib/rt.jar:/usr/share/java/gtk-4.1.jar:/home/theUser/workspaces/workspace/java/native/gtk-demo-1/lib/gtk-4.1.jar:/home/theUser/workspaces/workspace/java/native/gtk-demo-1/target/gtk-demo-1-1.0-SNAPSHOT.jar com.gtkdemo.Main

但是我正在努力通过 Maven 将这个 jar 添加到我的类路径中。我已经厌倦了使用的方法system

        <dependency>
            <artifactId>gtk</artifactId>
            <groupId>org.gnome.</groupId>
            <version>4.1</version>
            <scope>system</scope>
            <systemPath>${basedir}/lib/gtk-4.1.jar</systemPath>
        </dependency>

它能够构建 jar,但是当我尝试运行它时它失败了

➜  gtk-demo-1 git:(master) ✗ java -jar ./target/gtk-demo-1-1.0-SNAPSHOT.jar 
Exception in thread "main" java.lang.NoClassDefFoundError: org/gnome/gtk/Gtk
        at com.gtkdemo.Main.main(Main.java:12)
Caused by: java.lang.ClassNotFoundException: org.gnome.gtk.Gtk
        at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)

我尝试过的方法,

<plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>prepare-package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>
                                ${project.build.directory}/libs
                            </outputDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <classpathPrefix>libs/</classpathPrefix>
                            <mainClass>
                                com.gtkdemo.Main
                            </mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <shadedArtifactAttached>true</shadedArtifactAttached>
                            <transformers>
                                <transformer implementation=
                                                     "org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <mainClass>com.gtkdemo.Main</mainClass>
                                </transformer>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>com.jolira</groupId>
                <artifactId>onejar-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <configuration>
                            <mainClass>com.gtkdemo.Main</mainClass>
                            <attachToBuild>true</attachToBuild>
                            <filename>
                                ${project.build.finalName}.${project.packaging}
                            </filename>
                        </configuration>
                        <goals>
                            <goal>one-jar</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

让我知道我们是否需要上述每个尝试的样本。

示例代码 WIKI 供参考

标签: javamavenjargtk

解决方案


推荐阅读