运行代码时出现java.lang.IllegalAccessError

时间:2016-02-25 21:05:44

标签: java netbeans

我正在使用Java创建一个加载和显示X3D模型的应用程序,我已经下载了所有正确的jars并将它们放在项目中,我可以看到每个类每个jars都包含。但是,当我在NetBeans中运行我的代码时,我收到以下错误:

No skin defined in xj3d-skin.properties
Producing default properties.
Exception in thread "main" java.lang.IllegalAccessError: tried to access method org.j3d.aviatrix3d.ViewEnvironment.<init>()V from class org.j3d.aviatrix3d.surface.BaseRenderingProcessor
    at org.j3d.aviatrix3d.surface.BaseRenderingProcessor.<init>(BaseRenderingProcessor.java:223)
    at org.j3d.aviatrix3d.surface.RenderingProcessor.<init>(RenderingProcessor.java:49)
    at org.j3d.aviatrix3d.surface.SimpleAWTSurface.<init>(SimpleAWTSurface.java:95)
    at org.web3d.ogl.browser.X3DBrowserJPanel.<init>(X3DBrowserJPanel.java:264)
    at org.web3d.ogl.browser.X3DOGLBrowserFactoryImpl.createComponent(X3DOGLBrowserFactoryImpl.java:249)
    at org.web3d.x3d.sai.BrowserFactory.createX3DComponent(BrowserFactory.java:252)
    at xj3dtest.Xj3DTest.<init>(Xj3DTest.java:43)
    at xj3dtest.Xj3DTest.main(Xj3DTest.java:59)
C:\Users\matt\AppData\Local\NetBeans\Cache\8.1\executor-snippets\run.xml:53: Java returned: 1

我在时间点为项目提供的java代码如下所示:

package xj3dtest;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Container;
import static java.lang.Boolean.TRUE;
import javax.swing.JFrame;
import org.web3d.x3d.sai.Browser;
import org.web3d.x3d.sai.BrowserFactory;
import org.web3d.x3d.sai.X3DComponent;
import org.web3d.x3d.sai.X3DScene;
import java.util.HashMap;

public class Xj3DTest extends JFrame {

    public Xj3DTest(String title) {

        super(title);

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // Setup browser parameters
        HashMap requestedParameters=new HashMap();
        requestedParameters.put("Antialiased",TRUE);
        requestedParameters.put("TextureQuality","MEDIUM");
        requestedParameters.put("PrimitiveQuality","MEDIUM");
        requestedParameters.put("Xj3D_InterfaceType","SWING");
        requestedParameters.put("Xj3D_NavbarShown",TRUE);
        requestedParameters.put("Xj3D_NavbarPosition","TOP");
        requestedParameters.put("Xj3D_LocationShown",TRUE);
        requestedParameters.put("Xj3D_LocationPosition","TOP");
        requestedParameters.put("Xj3D_LocationReadOnly",TRUE);
        requestedParameters.put("Xj3D_ShowConsole",TRUE);
        requestedParameters.put("Xj3D_OpenButtonShown",TRUE);
        requestedParameters.put("Xj3D_ReloadButtonShown",TRUE);
        requestedParameters.put("Xj3D_StatusBarShown",TRUE);
        requestedParameters.put("Xj3D_FPSShown",TRUE);
        requestedParameters.put("Xj3D_ContentDirectory","CurrentDirectory");
        requestedParameters.put("Xj3D_AntialiasingQuality","LOW");
        requestedParameters.put("Xj3D_Culling_Mode", "frustum");

        System.setProperty("x3d.sai.factory.class", "org.web3d.ogl.browser.X3DOGLBrowserFactoryImpl");
        X3DComponent x3dComponent = BrowserFactory.createX3DComponent(requestedParameters);

        Browser browser = x3dComponent.getBrowser();

        Component browserComponent = (Component)    x3dComponent.getImplementation();

        Container cp = getContentPane();
        cp.setLayout(new BorderLayout());
        cp.add(browserComponent, BorderLayout.CENTER);

        X3DScene scene = browser.createX3DFromURL(new String[]   {"test.x3dv"});

        browser.replaceWorld(scene);
    }

    public static void main(String[] args) {
        Xj3DTest frame = new Xj3DTest("Xj3D test");
        frame.setSize(640, 480);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

正如您从我收到的错误消息中可以看到的那样,我得到了java.lang.IllegalAccessError的异常,我想知道如何修复它。感谢。

修改

以下列表是我正在使用的所有罐子。

aviatrix3d-all
aviatrix3d-all_2.2.0
aviatrix3d-core
aviatrix3d-glsl
aviatrix3d-utils
dis-enums
gnu-redexp-1.0.8
httpclient
j3d-org-all_3.0.0-nps
jogl_old
uri
vecmath
vlc_uri
xj3d-common_2.0.0
xj3d-config_
xj3d-core_2.0.0
xj3d-ecmascript_2.0.0
xj3d-external-sai_2.0.0
xj3d-j3d
xj3d-java-sai_2.0.0
xj3d-jaxp_2.0.0
xj3d-net
xj3d-norender_2.0.0
xj3d-ogl
xj3d-parser_2.0.0 
xj3d-render_2.0.0 
xj3d-runtime
xj3d-runtime_2.0.0
xj3d-sai_2.0.0
xj3d-sav_2.0.0
xj3d-script-base
xj3d-script-base_2.0.0
xj3d-xml_2.0.0

编辑#2

我已完成修改并已下载xj3d-2.1 installer并将其放入库中并将其放入项目中。我的代码如下所示。

package xj3dtest;

import java.awt.BorderLayout;
import java.awt.Container;
import static java.lang.Boolean.TRUE;
import javax.swing.JFrame;
import org.web3d.x3d.sai.Browser;
import org.web3d.x3d.sai.BrowserFactory;
import org.web3d.x3d.sai.X3DComponent;
import org.web3d.x3d.sai.X3DScene;
import java.util.HashMap;

public class Xj3DTest extends JFrame {

    public Xj3DTest(String title) {

        super(title);

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // Setup browser parameters
        HashMap requestedParameters=new HashMap();
        requestedParameters.put("Antialiased",TRUE);
        requestedParameters.put("TextureQuality","MEDIUM");
        requestedParameters.put("PrimitiveQuality","MEDIUM");
        requestedParameters.put("Xj3D_InterfaceType","SWING");
        requestedParameters.put("Xj3D_NavbarShown",TRUE);
        requestedParameters.put("Xj3D_NavbarPosition","TOP");
        requestedParameters.put("Xj3D_LocationShown",TRUE);
        requestedParameters.put("Xj3D_LocationPosition","TOP");
        requestedParameters.put("Xj3D_LocationReadOnly",TRUE);
        requestedParameters.put("Xj3D_ShowConsole",TRUE);
        requestedParameters.put("Xj3D_OpenButtonShown",TRUE);
        requestedParameters.put("Xj3D_ReloadButtonShown",TRUE);
        requestedParameters.put("Xj3D_StatusBarShown",TRUE);
        requestedParameters.put("Xj3D_FPSShown",TRUE);
        requestedParameters.put("Xj3D_ContentDirectory","CurrentDirectory");
        requestedParameters.put("Xj3D_AntialiasingQuality","LOW");
        requestedParameters.put("Xj3D_Culling_Mode", "frustum");

        System.setProperty("x3d.sai.factory.class", "org.xj3d.ui.awt.browser.ogl.X3DOGLBrowserFactoryImpl");
        X3DComponent x3dComponent = BrowserFactory.createX3DComponent(requestedParameters);

        Browser browser = x3dComponent.getBrowser();

        Container cp = getContentPane();
        cp.setLayout(new BorderLayout());
        cp.add((javax.swing.JPanel)x3dComponent, BorderLayout.CENTER);

        X3DScene scene = browser.createX3DFromURL(new String[]   {"test.x3dv"});

        browser.replaceWorld(scene);
    }

    public static void main(String[] args) {
        Xj3DTest frame = new Xj3DTest("Xj3D test");
        frame.setSize(640, 480);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

我现在得到的运行时错误是:

Feb 27, 2016 10:00:03 PM java.util.prefs.WindowsPreferences <init>
WARNING: Could not open/create prefs root node Software\JavaSoft\Prefs at root 0x80000002. Windows RegCreateKeyEx(...) returned error code 5.
Exception in thread "main" java.lang.IllegalArgumentException: BrowserConfig:  PrimitiveQuality must be low, medium or high
    at org.xj3d.sai.BrowserConfig.initialize(BrowserConfig.java:355)
    at org.xj3d.sai.BrowserConfig.<init>(BrowserConfig.java:240)
    at     org.xj3d.ui.awt.browser.ogl.X3DOGLBrowserFactoryImpl.createComponent(X3DOGLBrowserFactoryImpl.java:211)
    at     org.web3d.x3d.sai.BrowserFactory.createX3DComponent(BrowserFactory.java:263)
    at xj3dtest.Xj3DTest.<init>(Xj3DTest.java:42)
    at xj3dtest.Xj3DTest.main(Xj3DTest.java:56)
C:\Users\matt\AppData\Local\NetBeans\Cache\8.1\executor-snippets\run.xml:53:   Java returned: 1

1 个答案:

答案 0 :(得分:0)

好的,我想我已经有了一些工作。

看起来您的代码是为了与Xj3D 1一起编写的。我对代码进行了一些修改以使其与Xj3D 2一起使用。首先,将调用System.setProperty的行更改为以下内容:

        System.setProperty("x3d.sai.factory.class", "org.xj3d.ui.awt.browser.ogl.X3DOGLBrowserFactoryImpl");

进行此更改的想法取自here

其次,参数TextureQualityPrimitiveQualityXj3D_AntialiasingQuality的值必须是小写的,而不是现在的大写。

第三,事实证明,X3DComponent调用返回的BrowserFactory.createX3DComponentJPanel的子类,因此可以直接添加到Container无需致电getImplementation()。删除行

        Component browserComponent = (Component)    x3dComponent.getImplementation();

并替换

        cp.add(browserComponent, BorderLayout.CENTER);

        cp.add((javax.swing.JPanel)x3dComponent, BorderLayout.CENTER);

最后,您需要使用以下五个JAR,所有这些JAR都是由xj3d-2.1安装程序提供的,可以从here下载:

  • xj3d-2.1-3rdparty-nps.jar
  • xj3d-2.1-nps.jar
  • JOGL-all.jar在
  • joal.jar
  • gluegen-rt.jar中

进行这些更改后,我可以使用您的Xj3DTest类来查看X3D文件。我没有test.x3dv文件,因此我使用了the X3D file on Wikipedia。你的课似乎对我有用 - 我在Windows 10 x64上使用Java 1.8.0_60 x64,如果这有帮助 - 但它没有问题:

  • 窗口打开大约需要两分钟。我不知道它在这段时间做了什么。 Process Explorer显示两个jogamp_exe_tstNUMBERS.exe进程,每个进程运行大约一分钟。
  • 两分钟后出现以下消息(省略异常堆栈跟踪):

    SEVERE: Native code library (32 and 64 bit library) failed to load: java.lang.UnsatisfiedLinkError: no odejava in java.library.path
    

    如果你能找到odejava库的二进制版本,那么你做得比我好。不过,该计划似乎没有它。

  • 在窗口打开之前,以下消息会多次出现。同样,我不确定为什么,但他们似乎没有任何伤害:

    Message: Attempting to make GL context current again in order to initialise the surface
    Error: The GL context failed to initialise for some mysterious reason
    
  • 程序没有彻底退出:关闭窗口后,我必须从Process Explorer中删除java.exe进程。