2012-05-03 8 views
1

Я знаю, что существует ряд подобных вопросов, и они прошли через них без успеха. Я, вероятно, пропустил что-то очень основное. У меня есть html-файлы в пакете ressources в файле jar приложения, и мне нужно получить их пути для их чтения и обновления. Вот мой код:Как получить путь к ресурсам в банке

URL url = ClassLoader.class.getResource("/com/lamalva/ressources/test.html"); 
System.out.println(url);   
java.awt.Desktop.getDesktop().browse(java.net.URI.create(url.toString())); 

Когда я запускаю этот код из среды IDE NetBeans, выход: файла: /Users/Philippe/NetBeansProjects/Test/build/classes/com/lamalva/ressources/SatelliteQuotaMonitor.html и html-файл открыты в браузере как ожидалось, но когда я запускаю файл jar с терминала OSX, вывод: jar: file: /Users/Philippe/.Trash/Test/Test.jar!/Com/lamalva/ressources/SatelliteQuotaMonitor.html и файл html не открывается. Что бы я ни делал, мне не удалось найти правильный путь. У меня всегда есть «Test.jar!». в середине. Буду признателен за помощь

+1

Почему ваш файл JAR выполняется из вашей погани OSX? В любом случае, я уверен, что ваш браузер по умолчанию не будет знать, как получить HTML-ресурсы из JAR-файла. – Perception

+0

Я не знаю, почему файл jar выполняется вне корзины мусора. У меня нет простого ответа. Я буду перемещать файлы из банки и включать их в zip-файл, который легко и должен работать. – philippehenri

ответ

0

Нужно ли читать и обновлять ресурсы в файле jar?

Вы можете прочитать содержимое из потока ввода - использовать относительный путь, если ресурс находится в том же пакете, что и файл класса.

InputStream in = this.getClass().getResourceAsStream("/class/path/to/file"); 

писать, вы, вероятно, будете необходимо прочитать в содержании существующего кувшина, изменять детали, которые вы хотите, а затем выписывать обновленное содержимое, используя JarInputStream и JarOutputStream.

+0

Мои ресурсы - это html-файлы, которые мне нужно обновить и открыть в браузере по умолчанию. Мне не нужно читать их в приложении, но мне нужен их путь, чтобы открыть их в браузере. Файлы html хранятся в ресурсах, потому что им нужны javascripts в ресурсах/сценариях – philippehenri

+0

URL-адрес в java не обязательно является URL-адресом, который может понять веб-браузер. Вам нужно будет извлечь файл jar во временное место, тогда как браузер не сможет отображать файлы внутри банки. Посмотрите на java.util.jar.JarFile - вам нужно будет перебирать метод entries() и извлекать содержимое. – cvanes

0

Вам нужно использовать несколько ClassLoader, если вам нужен ресурс в банке. Этот фрагмент работает и в AppServers.

В этом примере я прочитал от sqlite-jdbc-3.7.2.jar файл, расположенный в пакете org.sqlite.

public class Main { 

private static InputStream getResourceAsStream(String resource) throws FileNotFoundException { 
    String stripped = resource.startsWith("/") ? resource.substring(1) : resource; 
    InputStream stream = null; 
    ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 
    if (classLoader != null) { 
     stream = classLoader.getResourceAsStream(stripped); 
    } 
    if (stream == null) { 
     stream = MyClass.class.getResourceAsStream(resource); 
    } 
    if (stream == null) { 
     stream = MyClass.class.getClassLoader().getResourceAsStream(stripped); 
    } 
    if (stream == null) { 
     throw new FileNotFoundException("File not found: " + resource); 
    } 
    return stream; 
} 

public static void main(String[] args) throws FileNotFoundException { 
    // Read file from JAR sqlite-jdbc-3.7.2.jar 
    Scanner sc = new Scanner(getResourceAsStream("org/sqlite/NativeDB.c")); 
    while(sc.hasNextLine()) { 
     System.out.println(sc.nextLine()); 
    } 
} 

}

Для получения более подробной информации читайте Java Classloader

Если вы хотите обновить содержимое, может Jar Inspector помочь вам.

0

URL-адрес с открытым протоколом ! не может использоваться в обычном браузере. Также как ssh: (терминал доступа) или smtp:/mailto: (e-mail). Также «file: ..../my.jar! ...» - такое непригодное расширение обычных URL-адресов.

Существует JTextPane/JEditorPane с ограниченной поддержкой HTML. И некоторые java-браузерные проекты.

Возможно, может быть использован веб-сервер java Jetty.

0

Чтобы открыть ресурс из пути к классам в веб-браузере платформы по умолчанию, у вас есть два варианта. Либо извлеките и скопируйте указанный ресурс во временное место в файловой системе, либо передайте файл: url. Другой и, вероятно, лучший вариант - запустить встроенный веб-сервер (например, Jetty) и обслуживать ресурсы непосредственно из вашего пути к классам.

2

Одна линия ответ -...

Строка путь = this.getClass() getClassLoader() getResource() toExternalForm().

В основном метод getResource дает URL-адрес. Из этого URL-адреса вы можете извлечь путь, вызвав toExternalForm().

Ссылки: https://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#getResource(java.lang.String)https://docs.oracle.com/javase/7/docs/api/java/net/URL.html#toExternalForm()

+0

Появляется, чтобы работать в моей среде IDE, но не из самого файла соло-jar. – Woodrow

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