【问题标题】:How to get Java3D to work in IntelliJ on OS X如何让 Java3D 在 OS X 上的 IntelliJ 中工作
【发布时间】:2014-10-15 08:49:45
【问题描述】:

我是一名计算机科学专业的学生,​​我需要让 Java3D 在我的 Mac 上运行,这样我才能完成强制性作业。

我使用 IntelliJ 作为我的 IDE,它适用于 Java 和 Python。但我正在努力使其适用于 Java3D。

我尝试使用我的 google-fu,但无济于事。所以我来这里寻求一些指导。我尝试了多个教程/指南,以下是我尝试过的:

我试图运行的代码来自http://www.java3d.org/starting.html

import com.sun.j3d.utils.universe.SimpleUniverse;

import com.sun.j3d.utils.geometry.ColorCube;

import javax.media.j3d.BranchGroup;

public class Hello3d {

    public Hello3d(){

    SimpleUniverse universe = new SimpleUniverse();

    BranchGroup group = new BranchGroup();

    group.addChild(new ColorCube(0.3));

    universe.getViewingPlatform().setNominalViewingTransform();

    universe.addBranchGraph(group);

    }

public static void main( String[] args ) {

    new Hello3d();

    }

}

我尝试的第一件事是安装 Java3d Jar 并将它们添加到依赖项中:(我从:http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-java-client-419417.html#java3d-1.5.1-oth-JPR

但我得到了错误:

Exception in thread "J3D-Renderer-1" java.lang.NoClassDefFoundError: apple/awt/ComponentModel
    at com.sun.opengl.impl.JAWT_DrawingSurface.GetDrawingSurfaceInfo0(Native Method)
    at com.sun.opengl.impl.JAWT_DrawingSurface.GetDrawingSurfaceInfo(JAWT_DrawingSurface.java:56)
    at com.sun.opengl.impl.macosx.MacOSXOnscreenGLDrawable$1.run(MacOSXOnscreenGLDrawable.java:165)
    at java.security.AccessController.doPrivileged(Native Method)
    at  com.sun.opengl.impl.macosx.MacOSXOnscreenGLDrawable.lockSurface(MacOSXOnscreenGLDrawable.java:163)
    at com.sun.opengl.impl.macosx.MacOSXOnscreenGLContext.makeCurrentImpl(MacOSXOnscreenGLContext.java:57)
    at com.sun.opengl.impl.GLContextImpl.makeCurrent(GLContextImpl.java:134)
    at javax.media.j3d.JoglPipeline$QueryCanvas.doQuery(JoglPipeline.java:9049)
    at javax.media.j3d.JoglPipeline.getBestConfiguration(JoglPipeline.java:8797)
    at javax.media.j3d.Renderer.doWork(Renderer.java:514)
    at javax.media.j3d.J3dThread.run(J3dThread.java:275)
Caused by: java.lang.ClassNotFoundException: apple.awt.ComponentModel
    at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 11 more

然后我得知 java3d 已经安装在 mac 上,我也做了同样的事情。我将罐子添加到我的依赖项中。但是我遇到了同样的错误。

我最后一次尝试是遵循本指南:http://gouessej.wordpress.com/2012/08/01/java-3d-est-de-retour-java-3d-is-back/

我下载了 jars,将它们全部放在同一个文件夹中,并将它们添加到我的依赖项中。但是,我又遇到了同样的错误。

现在,这可能都是我的错(我不确定是否必须将它们添加到我的依赖项中然后添加新的罐子,但是当我添加不同类型的 API 时它总是有效)或者它可能更复杂。希望你们中的一些人遇到了同样的问题,可以帮助我。

提前致谢。


编辑:在尝试了 gouessej 所说的之后,我得到了这个错误:

JavaVM WARNING: JAWT_GetAWT must be called after loading a JVM 
AWT not found
Exception in thread "main" java.lang.NoClassDefFoundError: apple/awt/CGraphicsDevice
    at javax.media.j3d.GraphicsConfigTemplate3D.<clinit>(GraphicsConfigTemplate3D.java:55)
    at com.sun.j3d.utils.universe.SimpleUniverse.getPreferredConfiguration(SimpleUniverse.java:368)
    at com.sun.j3d.utils.universe.Viewer.<init>(Viewer.java:348)
    at com.sun.j3d.utils.universe.Viewer.<init>(Viewer.java:298)
    at com.sun.j3d.utils.universe.SimpleUniverse.<init>(SimpleUniverse.java:215)
    at com.sun.j3d.utils.universe.SimpleUniverse.<init>(SimpleUniverse.java:177)
    at com.sun.j3d.utils.universe.SimpleUniverse.<init>(SimpleUniverse.java:88)
    at MAIN.<init>(MAIN.java:22)
    at MAIN.main(MAIN.java:41)
    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:483)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
Caused by: java.lang.ClassNotFoundException: apple.awt.CGraphicsDevice
    at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 14 more

【问题讨论】:

  • 你不能只使用支持 3D 的 JavaFX 吗?它是从 Java 8 开始的标准库的一部分。
  • @icza 我一直在努力理解它,但它看起来真的很复杂。但话又说回来,我只是匆匆瞥了一眼。我可能会再试一次。但如果我能让 java3d 工作,我会更喜欢它。我的老师使用它,我的朋友可能也会使用它。因此,如果我在某些事情上遇到困难,我可以从他们那里获得帮助,而不是在谷歌上搜索并希望有人和我有同样的问题(相关 XKCD - “古人的智慧”:P)
  • @icza 你的回答离题了。我受够了人们宣传他们的 API 而不是提供一些帮助。 JavaFX 3D API 有一些优点和一些缺点,它具有更高的最低要求,更高的内存占用,它的性能在不同平台之间并不一致,并且它的功能比大多数用 Java 编写的场景图 API 少得多。实际上,如果你真的想使用更强大的场景图形 API,不如使用 JogAmp 的 Ardor3D Continuation 或 JMonkeyEngine。
  • @gouessej 没必要生气。首先,我没有发布任何答案,我只是评论。评论可以是“任何东西”。其次,标准库不是我的 API。我与 Oracle 没有任何联系。我提出了一些可以解决提问者最初的问题的方法,即他无法启动一个 3D 库,如果他使用了 JavaFX,那么它一开始就不会存在,因为它是 JRE8 的一部分。由于其他信息(例如他想使用 3D 库的目的)没有发布,所以不清楚他为什么想要那个库,所以我建议了一个无故障的替代方案。
  • 即使使用作为 J2SE 一部分的标准 Java API 最初比使用 3rd 方库更容易,但没有“无故障”替代方案,因为无需安装任何东西。恕我直言,提问者在安装 Java 3D 方面寻求帮助,他没有问要使用哪个 3D 库,这就是为什么我认为您的评论是题外话。 SO 上的人应避免建议使用其他库,除非该库没有解决方案。如果您的汽车出现问题,建议您从另一家汽车制造商处购买另一辆汽车而不是修理它,这将无济于事。

标签: java macos intellij-idea java-3d


【解决方案1】:

你没有按照我的指示,答案在the "troubleshooting" section。您必须在安装新版本之前卸载 Java3D 的过时版本。如果您不这样做,JVM 将始终优先加载被脏复制到其中的那个或作为扩展安装的那个,这在 OS X 下通常是这种情况。

完成后,安装 JogAmp 和 Java3D,按照说明进行操作,非常简单。此外(如教程中所述),您应该在我们的official forum 上询问有关 Java3D 的问题。 JogAmp 贡献者不能在任何地方注册,在 Reddit 上,在这里,...

IntelliJ 可能允许将一些 JAR 放入类路径中,这应该不难。

警告:切换回 Java for OS X (Apple JVM 1.6) 是一个糟糕的解决方案,因为如果您不卸载它,它的 JRE 仍会选择 Java3D (1.5) 的过时版本, Apple Java is deprecated,您将无法从 Java3D 1.6 中包含的错误修复中受益,并且当您的操作系统不再支持 Apple Java(例如升级后)时,您的应用程序将无法运行. OS X 下与 OpenJDK 和 Oracle Java 1.8 兼容的 Java3D 唯一版本是 Java3D 1.6.0。

【讨论】:

  • 我试过了,但这次又报错了。我已经编辑了主要帖子并添加了错误。
  • 对不起,但另一个错误是相似的,并且具有相同的根本原因。要么你的机器上默认安装了旧版本的 Java3D,要么你使用(错误地)Oracle JAR,因为 Java3D 1.6.0(最新版本)不使用 apple/awt 中的类,而 Java3D 1.5 使用.只要你会得到这种错误,你就必须在你的机器上寻找一个过时的 Java3D 版本,正如我在这里解释的那样:forum.jogamp.org/…
  • 我建议您删除所有 JAR,即使是您下载的那些,在您的机器上查找 Java3D 并删除您在其他地方可以找到的所有 Java3D JAR,以避免任何混淆并开始干净的工作机器。然后,按照我的指示,它会工作。如果您仍然收到相同的错误,则表示您的机器上仍然存在 Java3D 的过时版本。
  • 我更新了我的教程,以阐明如何卸载 Java 3D 的过时版本,但不要将 JAR 放在同一目录中,这正是我的教程中不鼓励做的事情,那里是一个原因。
  • 在 Java 3D 的下一个预构建(1.6.0 pre 12)中不会与 Mac 下的 JOGL 1 混淆,因为它将使用使用不同包名称的 JOGL 2.3.1 :)欣赏:github.com/hharrison/java3d-core/pull/16
猜你喜欢
  • 2012-09-02
  • 2011-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多