【问题标题】:GsonBuilder cannot be found in JavaFX + Maven project's runnable jar在 JavaFX + Maven 项目的可运行 jar 中找不到 GsonBuilder
【发布时间】:2016-01-13 20:49:02
【问题描述】:

背景

我正在 Eclipse 中开发一个 Maven 项目 + JavaFX。 我的应用程序使用 Gson 进行序列化。

当然,当您没有包含 Gson.jar 时,Eclipse 会抱怨无法找到 GsonBuilder(或 gson 库的任何部分)。

我通过 Maven 依赖包含了这个库

在此之后,Eclipse 很酷,我可以导入 GsonBuilder(或任何 gson 库的部分)。

一切都很好。

mvn clean install 可以正常工作。

问题:

我去target目录执行java -jar myapplication.jar

Exception in thread "JavaFX Application Thread" java.lang.NoClassDefFoundError: com/google/gson/GsonBuilder
at app.MyApplication.<clinit>(MyApplication.java:68)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplicationWithArgs$153(LauncherImpl.java:352)
at com.sun.javafx.application.LauncherImpl$$Lambda$46/683287027.run(Unknown Source)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$172(PlatformImpl.java:326)
at com.sun.javafx.application.PlatformImpl$$Lambda$47/254413710.run(Unknown Source)
at com.sun.javafx.application.PlatformImpl.lambda$null$170(PlatformImpl.java:295)
at com.sun.javafx.application.PlatformImpl$$Lambda$49/1171144110.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$171(PlatformImpl.java:294)
at com.sun.javafx.application.PlatformImpl$$Lambda$48/553264065.run(Unknown Source)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
Caused by: java.lang.ClassNotFoundException: com.google.gson.GsonBuilder
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)
... 13 more
Exception in thread "main" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767)
Caused by: java.lang.NullPointerException
at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:383)
at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:328)
... 5 more

那么,你能帮帮我吗?发生了什么,我该如何解决?

为什么没有检测到?我的意思是,编译器编译没有错误。所以,gson 必须在那里。 我还尝试排除并重新包含该库。没有结果。

【问题讨论】:

  • 如何打包 JAR? Maven 不包含正常 JAR 构建中的依赖项,您必须使用例如maven-assembly-plugin 构建一个包含所有依赖项的 JAR。
  • 能否将pom.xml的内容添加到问题中?

标签: eclipse maven javafx jar gson


【解决方案1】:

@dunni 是对的。

我用maven-jar-plugin 代替maven-assembly-plugin

添加我的pom.xml
<build>
  <plugins>
    <plugin>
      <artifactId>maven-assembly-plugin</artifactId>
      <configuration>
        <archive>
          <manifest>
            <mainClass>my.main.class</mainClass>
          </manifest>
        </archive>
        <descriptorRefs>
          <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
      </configuration>
    </plugin>
  </plugins>
</build>

然后,执行:

mvn clean compile assembly:single

mvn install

target 目录中有一个后缀为jar-with-dependencies 的可执行jar。

之后,执行java -jar target/myapp-jar-with-dependencies.jar 就像一个魅力。

【讨论】:

    猜你喜欢
    • 2021-10-17
    • 2021-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-19
    • 2023-04-10
    • 1970-01-01
    • 2014-04-07
    相关资源
    最近更新 更多