2016-02-25 2 views
0

Я в процессе создания приложения на Java, которое загружает и отображает X3D-модель, и я загрузил все правильные jars и поместил их в проект, и я могу видеть каждый из классов, который содержит каждый из jars. Тем не менее, когда я запускаю мой код в NetBeans, я получаю следующее сообщение об ошибке:java.lang.IllegalAccessError при запуске кода

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, и мне интересно, как я буду исправлять его. Благодарю.

EDIT

В следующем списке все банки, которые я использую.

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 

EDIT # 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 
+0

Когда вы говорите «все правильные банки», какие именно JARs вы имеете в виду? Сообщение об исключении в вашем вопросе подсказывает мне, что ваши версии JAR непоследовательны. Измените свой вопрос, чтобы включить список всех JAR, которые вы используете, вместе со своими версиями. –

+0

@ LukeWoodward Я только что обновил вопрос. – smitthy

+0

Я просмотрел некоторые из aviatrix3d ​​и Xj3D JAR, которые я смог найти, и я не могу найти какие-либо классы в пакете 'org.j3d.aviatrix3d.surface'. Я также не вижу результатов поиска Google для таких классов. Знаете ли вы, какие из ваших JAR-файлов содержат, например, класс «BaseRenderingProcessor», который появляется в вашем стеке? Среди ваших JAR у вас есть номера без номера версии и некоторые с тем же именем и номером версии (например, 'aviatrix3d-all' и' aviatrix3d-all-2.2.0'). Возможно ли, что те, у кого нет суффикса, являются старыми версиями? –

ответ

0

Хорошо, я думаю, что у меня есть что-то работать.

Похоже, что ваш код был написан для работы с Xj3D 1. Я сделал несколько изменений в код, чтобы он работал с Xj3D 2. Во-первых, изменить строку, вызывающую System.setProperty к следующим:

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

Идея внести это изменение была взята из here.

Во-вторых, значения параметров TextureQuality, PrimitiveQuality и Xj3D_AntialiasingQuality должны быть в нижнем регистре, а не в верхнем регистре, как и в настоящий момент.

В-третьих, оказывается, что X3DComponent, который получает возвращаемый вызовом BrowserFactory.createX3DComponent является подклассом JPanel, поэтому он может быть добавлен непосредственно в Container без необходимости вызывать getImplementation(). Удалить строку

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

и замените строку

 cp.add(browserComponent, BorderLayout.CENTER); 

с

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

Наконец, вам нужно использовать следующие пять JARs, все из которых осуществляются по 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. Ваш класс оказался работать для меня – Я использую Java 1.8.0_60 x64 на Windows 10 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 
    
  • Программа не выходит чисто: Я должен убить процесс java.exe из Process Explorer после закрытия окно.

+0

Итак, если я вношу эти изменения в код и загружаю эти пять банок и размещаю их в пределах той же библиотеки, что и банки, перечисленные в вопрос, он должен работать? Или я должен удалить дубликаты фляг? – smitthy

+0

@smitthy: избавь остальных от дороги. Просто используйте эти пять. Это все, что мне нужно. –

+0

Итак, избавитесь от всех банок, которые я уже загрузил, и у вас есть только те 5, которые вы указали? – smitthy

Смежные вопросы