Не работает загрузка ресурсов во внешних банках

1

Я делаю игру с использованием LWJGL и Slick2d, и, естественно, у меня есть игровые ресурсы для экспорта в мою банку. Однако они не могут загружаться из исполняемого файла.jar, который я создаю с помощью jarsplice, но будут запускаться, когда они находятся в той же папке, что и файл.jar. Я пытаюсь использовать.getSystemResource() и.getSystemResourceAsStream() для загрузки файлов в исходный код в Eclipse для решения этой проблемы, но это не сработает. Я потратил часы на поиск в stackoverflow, gamedev.net, форумах lwjgl и форумах slick2d для загрузки ресурсов в jars, экспортированных из Eclipse, но безрезультатно. Здесь процесс, который я просматриваю:

1) Я настраиваю свой путь сборки - все включено, ничего не исключено.

2) все библиотеки правильно добавлены;

3) все выбирается для заказа и экспорта.

4) Я экспортирую как общий (non-runnable).jar, отменив выбор этих папок и пакетов, на которые не ссылается мой код. Эти папки, содержащие мои аудио, изображения и шейдеры, правильно помечены для экспорта.

http://imgur.com/ldHuC1x.jpg

5) Я открываю файл.jar, и все внутри, как и должно быть. На этом этапе файл манифеста пуст.

6) Я создаю fat.jar, используя jarsplice, сначала добавляя файлы.jar;

7) Затем я добавляю всех туземцев, которые требуются lwjgl;

8) наконец, я вхожу в свой основной класс, используя полный путь пакета.

9) когда я создаю.jar и заглядываю внутрь, все включено, как и должно быть.

http://imgur.com/o9qX3iW.jpg

Кроме того, файл манифеста теперь правильно заполнен:

Manifest-Version: 1.0
Launcher-VM-Args: 
Launcher-Main-Class: com.fafnir.gestalt.Bootstrap
Main-Class: org.ninjacave.jarsplice.JarSpliceLauncher

10) после запуска.jar с использованием java -jar FatRunnable.jar 'Я получаю ошибки, поэтому я создаю файл.bat для его запуска и регистрации вывода в текстовом файле:

java -jar FatRunnable.jar %* > log.txt
PAUSE

11) Я проверяю текстовый файл и вижу следующее:

Wed Jul 30 17:42:11 EDT 2014 INFO:Initialising sounds..
[LWJGL] getPathFromClassLoader: searching for: OpenAL32
[LWJGL] Failed to locate findLibrary method: java.lang.NoSuchMethodException: sun.misc.Launcher$AppClassLoader.findLibrary(java.lang.String)
[LWJGL] Failed to locate findLibrary method: java.lang.NoSuchMethodException: java.net.URLClassLoader.findLibrary(java.lang.String)
[LWJGL] Failed to locate findLibrary method: java.lang.NoSuchMethodException: java.security.SecureClassLoader.findLibrary(java.lang.String)
[LWJGL] getPathFromClassLoader: searching for: lwjgl
[LWJGL] Failed to locate findLibrary method: java.lang.NoSuchMethodException: sun.misc.Launcher$AppClassLoader.findLibrary(java.lang.String)
[LWJGL] Failed to locate findLibrary method: java.lang.NoSuchMethodException: java.net.URLClassLoader.findLibrary(java.lang.String)
[LWJGL] Failed to locate findLibrary method: java.lang.NoSuchMethodException: java.security.SecureClassLoader.findLibrary(java.lang.String)
[LWJGL] getPathFromClassLoader: searching for: lwjgl
[LWJGL] Failed to locate findLibrary method: java.lang.NoSuchMethodException: sun.misc.Launcher$AppClassLoader.findLibrary(java.lang.String)
[LWJGL] Failed to locate findLibrary method: java.lang.NoSuchMethodException: java.net.URLClassLoader.findLibrary(java.lang.String)
[LWJGL] Failed to locate findLibrary method: java.lang.NoSuchMethodException: java.security.SecureClassLoader.findLibrary(java.lang.String)
[LWJGL] Found 6 OpenAL paths
[LWJGL] Testing 'C:\Users\MOTHAF~1\AppData\Local\Temp\\natives-1942957663\OpenAL64.dll'
[LWJGL] Found OpenAL at 'C:\Users\MOTHAF~1\AppData\Local\Temp\\natives-1942957663\OpenAL64.dll'
[LWJGL] MemoryUtil Accessor: AccessorUnsafe
Wed Jul 30 17:42:11 EDT 2014 INFO:- Sound works
Wed Jul 30 17:42:11 EDT 2014 INFO:- 64 OpenAL source available
Wed Jul 30 17:42:11 EDT 2014 INFO:- Sounds source generated
[LWJGL] Initial mode: 1600 x 900 x 32 @60Hz
[LWJGL] Found 32 displaymodes
[LWJGL] Removed 20 duplicate displaymodes
Detected display modes:
800x600x32 60Hz
1600x900x16 60Hz
640x480x16 60Hz
1024x768x16 60Hz
1280x720x32 60Hz
1280x800x16 60Hz
800x600x16 60Hz
1600x900x32 60Hz
640x480x32 60Hz
1024x768x32 60Hz
1280x720x16 60Hz
1280x800x32 60Hz
[LWJGL] GL_EXT_direct_state_access was reported as available but an entry point is missing
OpenGL version: 3.2.9712 Core Profile Forward-Compatible Context
Could not read file.
java.io.FileNotFoundException: glsl\textured.vs (The system cannot find the path specified)
    at java.io.FileInputStream.open(Native Method)
    at java.io.FileInputStream.<init>(FileInputStream.java:131)
    at java.io.FileInputStream.<init>(FileInputStream.java:87)
    at java.io.FileReader.<init>(FileReader.java:58)
    at com.fafnir.gestalt.quads.QuadUpdateVBO.loadShader(QuadUpdateVBO.java:180)
    at com.fafnir.gestalt.quads.QuadUpdateVBO.setupShaders(QuadUpdateVBO.java:146)
    at com.fafnir.gestalt.quads.QuadUpdateVBO.<init>(QuadUpdateVBO.java:49)
    at com.fafnir.gestalt.Bootstrap.setupArtists(Bootstrap.java:167)
    at com.fafnir.gestalt.Bootstrap.<init>(Bootstrap.java:72)
    at com.fafnir.gestalt.Bootstrap.main(Bootstrap.java:38)
AL lib: (EE) alc_cleanup: 1 device not closed
Could not locate symbol glEnableClientStateiEXT
Could not locate symbol glDisableClientStateiEXT
Could not locate symbol glGetFloati_vEXT
Could not locate symbol glGetDoublei_vEXT
Could not locate symbol glGetPointeri_vEXT
Could not locate symbol glNamedCopyBufferSubDataEXT
Could not locate symbol glVertexArrayIndexOffsetEXT
Could not locate symbol glVertexArrayVertexAttribOffsetEXT
Could not locate symbol glVertexArrayVertexAttribIOffsetEXT
Could not locate symbol glEnableVertexArrayEXT
Could not locate symbol glDisableVertexArrayEXT
Could not locate symbol glEnableVertexArrayAttribEXT
Could not locate symbol glDisableVertexArrayAttribEXT
Could not locate symbol glGetVertexArrayIntegervEXT
Could not locate symbol glGetVertexArrayPointervEXT
Could not locate symbol glGetVertexArrayIntegeri_vEXT
Could not locate symbol glGetVertexArrayPointeri_vEXT
Could not locate symbol glMapNamedBufferRangeEXT
Could not locate symbol glFlushMappedNamedBufferRangeEXT

12), казалось бы, несмотря на то, что шейдеры находятся в файле.jar, он не может найти шейдеры, расположенные в папке "glsl". Из того, что я собираю, это потому, что они не являются отдельными файлами, а расположены в пределах.jar и должны быть доступны с использованием другого кода.

Шейдеры загружаются путем передачи пути к файлам вместе с значением GL20 в метод loadShader (String fileName, int type):

// Load the vertex shader
vsId = loadShader("glsl/textured.vs", GL20.GL_VERTEX_SHADER);

// Load the fragment shader
fsId = loadShader("glsl/textured.fs", GL20.GL_FRAGMENT_SHADER);

13) метод loadShader, который работал в eclipse, но не для.jar, был следующим:

public static int loadShader(String fileName, int type) {
    final StringBuilder shaderSource = new StringBuilder();
    int shaderID = 0;

    try {
        final BufferedReader reader = new BufferedReader(new FileReader(fileName));
        String line;
        while ((line = reader.readLine()) != null) {
            shaderSource.append(line).append("\n");
        }
        reader.close();
    } catch (final IOException e) {
        System.err.println("Could not read file.");
        e.printStackTrace();
        System.exit(-1);
    }

    shaderID = GL20.glCreateShader(type);
    GL20.glShaderSource(shaderID, shaderSource);
    GL20.glCompileShader(shaderID);

    if (GL20.glGetShaderi(shaderID, GL20.GL_COMPILE_STATUS) == GL11.GL_FALSE) {
        // Check for any OpenGL errors
        OpenGLHelper.exitOnGLError("Error in quads.QuadUpdateVBO.loadShader()");
    }

    return shaderID;
}

14) Я попытался изменить его, чтобы использовать ClassLoader, чтобы он работал с ресурсами, упакованными внутри.jar, но я даже не могу заставить его работать в eclipse. Это мой новый метод:

public static int loadShader(String fileName, int type) {
    final StringBuilder shaderSource = new StringBuilder();
    int shaderID = 0;

    try (InputStream shaderStream = QuadUpdateVBO.class.getResourceAsStream(fileName);
            BufferedReader reader = new BufferedReader(new InputStreamReader(shaderStream))) {
        String line;
        while ((line = reader.readLine()) != null) {
            shaderSource.append(line).append("\n");
        }
    } catch (final IOException e) {
        System.err.println("Could not read file.");
        e.printStackTrace();
        System.exit(-1);
    }

    shaderID = GL20.glCreateShader(type);
    GL20.glShaderSource(shaderID, shaderSource);
    GL20.glCompileShader(shaderID);

    if (GL20.glGetShaderi(shaderID, GL20.GL_COMPILE_STATUS) == GL11.GL_FALSE) {
        // Check for any OpenGL errors
        OpenGLHelper.exitOnGLError("Error in quads.QuadUpdateVBO.loadShader()");
    }

    return shaderID;
}

и вот вывод на консоль Eclipse при запуске моего класса Bootstrap:

Wed Jul 30 17:58:02 EDT 2014 INFO:Initialising sounds..
[LWJGL] getPathFromClassLoader: searching for: OpenAL32
[LWJGL] Failed to locate findLibrary method: java.lang.NoSuchMethodException:     sun.misc.Launcher$AppClassLoader.findLibrary(java.lang.String)
[LWJGL] Failed to locate findLibrary method: java.lang.NoSuchMethodException:     java.net.URLClassLoader.findLibrary(java.lang.String)
[LWJGL] Failed to locate findLibrary method: java.lang.NoSuchMethodException:     java.security.SecureClassLoader.findLibrary(java.lang.String)
[LWJGL] getPathFromClassLoader: searching for: lwjgl
[LWJGL] Failed to locate findLibrary method: java.lang.NoSuchMethodException:     sun.misc.Launcher$AppClassLoader.findLibrary(java.lang.String)
[LWJGL] Failed to locate findLibrary method: java.lang.NoSuchMethodException:     java.net.URLClassLoader.findLibrary(java.lang.String)
[LWJGL] Failed to locate findLibrary method: java.lang.NoSuchMethodException:     java.security.SecureClassLoader.findLibrary(java.lang.String)
[LWJGL] getPathFromClassLoader: searching for: lwjgl
[LWJGL] Failed to locate findLibrary method: java.lang.NoSuchMethodException:     sun.misc.Launcher$AppClassLoader.findLibrary(java.lang.String)
[LWJGL] Failed to locate findLibrary method: java.lang.NoSuchMethodException:     java.net.URLClassLoader.findLibrary(java.lang.String)
[LWJGL] Failed to locate findLibrary method: java.lang.NoSuchMethodException:     java.security.SecureClassLoader.findLibrary(java.lang.String)
[LWJGL] Found 14 OpenAL paths
[LWJGL] Testing 'C:\Program Files\eclipse\external jars\LWJGL     2.9.2\native\windows\OpenAL64.dll'
[LWJGL] Found OpenAL at 'C:\Program Files\eclipse\external jars\LWJGL     2.9.2\native\windows\OpenAL64.dll'
[LWJGL] MemoryUtil Accessor: AccessorUnsafe
Wed Jul 30 17:58:03 EDT 2014 INFO:- Sound works
Wed Jul 30 17:58:03 EDT 2014 INFO:- 64 OpenAL source available
Wed Jul 30 17:58:03 EDT 2014 INFO:- Sounds source generated
[LWJGL] Initial mode: 1600 x 900 x 32 @60Hz
[LWJGL] Found 32 displaymodes
[LWJGL] Removed 20 duplicate displaymodes
Detected display modes:
800x600x32 60Hz
1600x900x16 60Hz
640x480x16 60Hz
1024x768x16 60Hz
1280x720x32 60Hz
1280x800x16 60Hz
800x600x16 60Hz
1600x900x32 60Hz
640x480x32 60Hz
1024x768x32 60Hz
1280x720x16 60Hz
1280x800x32 60Hz
[LWJGL] GL_EXT_direct_state_access was reported as available but an entry point is     missing
OpenGL version: 3.2.9712 Core Profile Forward-Compatible Context
Exception in thread "main" java.lang.NullPointerException
    at java.io.Reader.<init>(Unknown Source)
    at java.io.InputStreamReader.<init>(Unknown Source)
    at com.fafnir.gestalt.quads.QuadUpdateVBO.loadShader(QuadUpdateVBO.java:194)
    at com.fafnir.gestalt.quads.QuadUpdateVBO.setupShaders(QuadUpdateVBO.java:147)
    at com.fafnir.gestalt.quads.QuadUpdateVBO.<init>(QuadUpdateVBO.java:50)
    at com.fafnir.gestalt.Bootstrap.setupArtists(Bootstrap.java:167)
    at com.fafnir.gestalt.Bootstrap.<init>(Bootstrap.java:72)
    at com.fafnir.gestalt.Bootstrap.main(Bootstrap.java:38)
AL lib: (EE) alc_cleanup: 1 device not closed
Could not locate symbol glEnableClientStateiEXT
Could not locate symbol glDisableClientStateiEXT
Could not locate symbol glGetFloati_vEXT
Could not locate symbol glGetDoublei_vEXT
Could not locate symbol glGetPointeri_vEXT
Could not locate symbol glNamedCopyBufferSubDataEXT
Could not locate symbol glVertexArrayIndexOffsetEXT
Could not locate symbol glVertexArrayVertexAttribOffsetEXT
Could not locate symbol glVertexArrayVertexAttribIOffsetEXT
Could not locate symbol glEnableVertexArrayEXT
Could not locate symbol glDisableVertexArrayEXT
Could not locate symbol glEnableVertexArrayAttribEXT
Could not locate symbol glDisableVertexArrayAttribEXT
Could not locate symbol glGetVertexArrayIntegervEXT
Could not locate symbol glGetVertexArrayPointervEXT
Could not locate symbol glGetVertexArrayIntegeri_vEXT
Could not locate symbol glGetVertexArrayPointeri_vEXT
Could not locate symbol glMapNamedBufferRangeEXT
Could not locate symbol glFlushMappedNamedBufferRangeEXT
  • 0
    1-й: TMI 2-й: находится ли файл шейдера рядом с классом QuadUpdateVBO в банке?
  • 0
    Нет, QuadUpdateVBO находился в «com.fafnir.gestalt.quads», в то время как файл шейдера находился в «glsl /».
Теги:
lwjgl
jar
slick2d

1 ответ

0

Выявили надежный способ ответить на мою собственную проблему - создав новый класс под названием "ResourceHandler", я создал несколько методов для ввода строк как параметров, а также логическое значение (чтобы указать, загружалось ли оно в стиле из.getSystemResourceAsStream() или нет) и выплюнуть либо BufferedReaders, InputStreams, либо Audio объекты, которые работают как в Eclipse, так и упакованы в Fat.jar с использованием jarsplice. здесь код для класса:

package com.fafnir.gestalt.helpers;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URISyntaxException;
import java.net.URL;

import org.newdawn.slick.openal.Audio;
import org.newdawn.slick.openal.AudioLoader;
import org.newdawn.slick.util.ResourceLoader;

public class ResourceHandler {

/**
 * Returns a buffered reader of the input file from a (non/)streaming resource
 * 
 * @param filePath
 * @param streaming
 * @return
 */
public static BufferedReader loadIntoBufferedReader(String filePath, boolean streaming) {
    BufferedReader reader = null;
    if (streaming) {
        InputStream stream = ResourceLoader.getResourceAsStream(filePath);
        InputStreamReader isr = new InputStreamReader(stream);
        reader = new BufferedReader(isr);
    } else {
        URL url = ResourceLoader.getResource(filePath);

        try (FileReader freader = new FileReader(url.toURI().toString())) {
            reader = new BufferedReader(freader);
        } catch (FileNotFoundException fnfe) {
            System.err.println("File " + filePath + " does not exist!");
            fnfe.printStackTrace();
            System.exit(1);
        } catch (URISyntaxException urise) {
            System.err.println("Bad URI syntax for " + filePath + "!");
            urise.printStackTrace();
            System.exit(1);
        } catch (IOException ioe) {
            System.err.println("File " + filePath + " couldn't be read/written to!");
            ioe.printStackTrace();
            System.exit(1);
        }
    }

    return reader;
}

/**
 * Returns an InputStream of the input file
 * 
 * @param filePath
 * @return
 */
public static InputStream loadIntoInputStream(String filePath) {
    InputStream stream = ResourceLoader.getResourceAsStream(filePath);
    return stream;
}

/**
 * Returns an Audio object of the input file as a stream
 * 
 * @param type
 * @param filePath
 * @return
 */
public static Audio loadIntoAudio(String type, String filePath, boolean streaming) {
    Audio audio = null;
    try {
        if (streaming) {
            audio = AudioLoader.getStreamingAudio(type, ResourceLoader.getResource(filePath));
        } else {
            audio = AudioLoader.getAudio(type, ResourceLoader.getResourceAsStream(filePath));
        }
    } catch (final IOException ioe) {
        System.err.println("File " + filePath + " couldn't be read/written to!");
        ioe.printStackTrace();
        System.exit(1);
    }
    return audio;
}

}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню