getResource () не может загрузить содержимое в банку - PullRequest
5 голосов
/ 21 февраля 2012

Я могу успешно загрузить ресурсы, которые находятся в каком-то пакете моего src / dir в eclipse.Теперь я экспортирую jar (щелкните правой кнопкой мыши src, export, jar и сохраните настройки по умолчанию) и не могу загрузить ресурс в другом проекте Eclipse.

Я строю путь к ресурсу, указывая классстоя в том же названии пакета:

URL out = getClass().getClassLoader().getResource(packageName(getClass())+"file.glsl");
// out is null when loaded from a jar!!   

protected static String packageName(Class<?> clazz){
    return packageName(clazz.getPackage());
}
protected static String packageName(Package p){
    return c + p.getName().replace('.', c) + c;
}
protected static char c = File.separatorChar;

Видите ли вы какой-то неправильный путь?Я пытался:

  • getClass (). GetResource ()
  • getClass (). GetClassLoader (). GetResource ()
  • getClass (). GetClassLoader ().getResourceAsStream ()
  • Thread.currentThread (). getContextClassLoader (). getResource ()
  • добавление / удаление символа '/' в начале имени пакета
  • с использованиемлибо '/', '\', либо File.separatorChar, и даже '.', все не удалось.

Я убедился, что:

  • jar содержит ресурс (развертывание содержимого jar в «Ссылочных библиотеках» проекта eclipse)
  • packageName (getClass ()) + filename) возвращает чистое имя: «\ org \ jzy3d \ plot3d \ render \ ddp \gorithms \ dual_peeling_init_vertex.glsl»

Я бесконечно извлекаю ноль: /


РЕДАКТИРОВАТЬ: снимок экрана и код, чтобы показать, что «это должно работать»

enter image description here

Вы можете получить этот проект затмения в формате SSCCE здесь

Класс пользователя

public class User {
    public static void main(String[] args) {
        Loader pair = new Loader(SomeClass.class, "shade_vertex.glsl");
        System.out.println("found:" + pair.getURL());

    }
}

Предоставление класса динамическис новым SomeClass (). getClass () выдает тот же результат.

Загрузчик

package com.pkg.loader;

import java.io.File;
import java.net.URL;

public class Loader {
    public Loader(Class<?> c, String file) {
        this(packageName(c.getPackage()), file);
    }

    public Loader(Package p, String file) {
        this(packageName(p), file);
    }

    protected Loader(String pack, String file) {
        this.pack = pack;
        this.file = file;
    }

    public String getStringPath() {
        return pack+file;
    }

    public URL getURL() {
        URL out = Thread.currentThread().getContextClassLoader().getResource(getStringPath());
        if(out==null)
            throw new RuntimeException("unable to find shader URL for :'"+getStringPath()+"'");
        return out;
    }

    protected static String packageName(Class<?> clazz){
        return packageName(clazz.getPackage());
    }

    protected static String packageName(Package p){
        return c + p.getName().replace('.', c) + c;
    }

    protected static char c = File.separatorChar;

    protected String pack;
    protected String file;
}

Маркер класса

public class SomeClass {}

Ответы [ 2 ]

2 голосов
/ 21 февраля 2012

Во-первых, постарайтесь не помещать исходные файлы непосредственно в пакет по умолчанию (src).Создайте хотя бы один пакет, чтобы обернуть ваш исходный код, потому что при экспорте файлов jar папка src не включается.Поэтому, если вы создадите свой собственный пакет по умолчанию, у вас будет определенный корневой каталог, на котором будут основаны ваши пути к ресурсам.

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

YourClass.class.getResource("/your_root_package/blah/blah/file.glsl");

У меня это работает для изображений:

public static Image ICON32 = Toolkit.getDefaultToolkit().getImage(MainFrame.class.getResource("/files/images/icon32.png"));

Да, так что, надеюсь, это поможет.:)

0 голосов
/ 19 июня 2013

Проблема на самом деле в этой строке:

protected static char c = File.separatorChar;

Это будет обратная косая черта в Windows, но пути для Class#getResource() должны быть косыми чертами для правильной работы. JRE, вероятно, ищет ваш путь как относительный путь и буквально интерпретирует обратную косую черту.

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

URL out = getClass().getResource("file.glsl");

Class#getResource() уже обрабатывает разрешение относительно класса, поэтому дублировать этот код в вашем приложении не имеет смысла.

...