2016-05-09 9 views
1

Привет, когда я запускаю свое приложение из Eclipse, он работает отлично, но когда я экспортирую его как исполняемый банку, он не запускается. Когда я пытаюсь запустить его из CMD дает мне один из 2-х ошибок первого errror после я просто экспортировать его с «копией необходимых библиотек в подпапке»:Ошибка Java 3d при запуске приложения из .jar

Exception in thread "main" java.lang.UnsatisfiedLinkError: no j3dcore-ogl in java.library.path 
    at java.lang.ClassLoader.loadLibrary(Unknown Source) 
    at java.lang.Runtime.loadLibrary0(Unknown Source) 
    at java.lang.System.loadLibrary(Unknown Source) 
    at javax.media.j3d.NativePipeline$1.run(NativePipeline.java:189) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at javax.media.j3d.NativePipeline.loadLibrary(NativePipeline.java:180) 
    at javax.media.j3d.NativePipeline.loadLibraries(NativePipeline.java:137) 
    at javax.media.j3d.MasterControl.loadLibraries(MasterControl.java:948) 
    at javax.media.j3d.VirtualUniverse.<clinit>(VirtualUniverse.java:280) 
    at javax.media.j3d.Canvas3D.<clinit>(Canvas3D.java:3862) 
    at Main.Game.<init>(Game.java:39) 
    at Main.Main.main(Main.java:6) 

, когда я изменить суб- имя папки от IslandDomination_lib просто импровизировать это дает мне еще одну ошибку:

Exception in thread "main" java.lang.NoClassDefFoundError: javax/media/j3d/Canvas3D 
     at Main.Main.main(Main.java:6) 
    Caused by: java.lang.ClassNotFoundException: javax.media.j3d.Canvas3D 
    at java.net.URLClassLoader.findClass(Unknown Source) 
    at java.lang.ClassLoader.loadClass(Unknown Source) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) 
    at java.lang.ClassLoader.loadClass(Unknown Source) 
    ... 1 more 

Я попытался запустить его несколькими способами:

1.

java.exe -jar IslandDomination.jar 

2.

java.exe -cp "lib/j3dcore.jar;lib/j3dutils.jar;lib/vecmath.jar" -jar IslandDomination.jar 

3. с помощью другой программы Java, чтобы запустить его для меня:

package main; 
import java.io.File; 
import java.io.IOException; 

public class Main { 
    public static void main(String[] args) throws IOException,  InterruptedException{ 
    ProcessBuilder pb = new ProcessBuilder(System.getProperty("java.home")+"\\bin\\java.exe", "-cp" , "\"lib/j3dcore.jar;lib/j3dutils.jar;lib/vecmath.jar\"" , "-jar" , "IslandDomination.jar"); 
    pb.directory(new File("./")); 
    Process p = pb.start(); 
    p.waitFor(); 
    } 
} 

Внутренняя структура моей баночке состоит из 4-х папок:

J3DBool 
Main 
Maths 
META-INF 

Папка с необходимыми банками находится в той же папке, что и основная банка

+0

Просто обновите ваш Путь к классам выполнения, чтобы включить эту баночку и убедитесь, что он на самом деле находится на пути к классам готов к использованию.Можете ли вы обновить свой вопрос, чтобы указать, как вы запускаете приложение из банки, а также отображаете внутреннюю структуру вашей банки? – ManoDestra

+0

JOGL отсутствует, он должен быть в вашем пути к классу, Java3D 1.5 (устаревший) использует JOGL 1.1.1 (устаревший). Посмотрите на мой ответ ниже. j3dcore-ogl.dll необходимо, если Java3D не использует конвейер JOGL. Использование Java3D 1.6.0 менее громоздко и безопаснее. – gouessej

ответ

0

Я думаю, что необходимый файл библиотеки (файл jar) не найден в пути к классам.

необходимо установить файл библиотеки в свой путь к классу.

шаг установить путь к классу: -

MyComputer-> свойства-> Развитая система Настройка-> Переменные среды

найти «либо» путь к классам в области пользовательских переменных или в системных переменных, если найдено редактировать это и поместить всю ссылку файла jar. если не найдено, то создайте новый (нажмите на новый) и поместите всю ссылку на jar и попробуйте запустить приложение.

+0

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

+0

На момент экспорта jar file выберите «Необходимые для пакета библиотеки в сгенерированный JAR». Он создает один файл jar, включая весь файл библиотеки. –

+0

он по-прежнему дает мне первую ошибку –

1

Вы используете полностью устаревшую версию Java3D, которую очень сложно скомпоновать в любом программном обеспечении, задайте путь библиотеки Java как-то, и вам нужно собрать как библиотеки Java , так и родные библиотеки. Скорее перестройте свой проект с помощью Java3D 1.6.0 до 12, его гораздо проще использовать, поскольку эта версия использует JOGL 2, которая использует автоматическую загрузку загружаемой библиотеки и все упаковано в виде JAR, больше не нужно изменять путь к библиотеке, просто позаботьтесь о classpath.

Пожалуйста, следуйте my tutorial, особенно самый последний раздел с (много) дополнительной информацией.

Наконец, устаревшая версия, которую вы используете, не гарантируется для работы с любыми новейшими операционными системами. Если это сработает, вам повезет; если это не так, никто не исправит это.

+0

Хорошо, я попробую это –

+0

Если вам нужна помощь, чтобы сделать единый толстый JAR, дайте мне знать. Я советую использовать Ant, он может работать и в Eclipse, но для него не требуется IDE. Он очень гибкий и мощный, мы можем использовать множество пользователей JogAmp, и мы сможем помочь вам, если что-то пойдет не так. Если бы я был вами, я бы просто объединил ваш JAR с j3dcore.jar, j3dutils.jar, vecmath.jar и jogamp-fat.jar. Затем конечным пользователям не придется переделывать переменные среды для установки пути к библиотеке, вам не придется беспокоиться о 32-разрядных/64-разрядных архитектурах. – gouessej

+0

Я только что увидел, что наличие необходимых dll-s рядом с файлом jar исправляет мою проблему –

0

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

+0

j3dcore-ogl.dll используется только тогда, когда Java3D 1.5 использует собственный конвейер OpenGL (см. J3d.rend, чтобы изменить это поведение). Когда Java3D 1.5 использует конвейер JOGL, для него требуются библиотеки Java и собственные библиотеки JOGL. Насколько я знаю, Java3D 1.5 не использует тот же конвейер под Windows 32-bit и Windows 64-bit. Поэтому вы только исправили небольшую часть своей проблемы. – gouessej