JNLP извлечение файлов из jar

#java #swing #jnlp

#java #качать #jnlp

Вопрос:

Это мой файл jar : файл jar

Когда я запускаю свой код (ниже) с моим jar java -jar myprogram.jar , он извлекает файл из jar (Jar делает то, что мне нужно)

 List<Path> result = this.getPathsFromResourceJAR("tokenconfig.json");
for (Path path : result) {
    String filePathInJAR = path.toString();
    if (filePathInJAR.startsWith("/")) {
        filePathInJAR = filePathInJAR.substring(1, filePathInJAR.length());
    }
    System.out.println("filePathInJAR : "   filePathInJAR);
    // read a file from resource folder
    InputStream is = this.getFileFromResourceAsStream(filePathInJAR);
    FileUtils.copyInputStreamToFile(is, new File(filePathInJAR) );
}          

// get a file from the resources folder
// works everywhere, IDEA, unit test and JAR file.
private InputStream getFileFromResourceAsStream(String fileName) {

    // The class loader that loaded the class
    ClassLoader classLoader = getClass().getClassLoader();
    InputStream inputStream = classLoader.getResourceAsStream(fileName);

    // the stream holding the file content
    if (inputStream == null) {
        throw new IllegalArgumentException("file not found! "   fileName);
    } else {
        return inputStream;
    }

}

// Get all paths from a folder that inside the JAR file
private List<Path> getPathsFromResourceJAR(String folder)
    throws URISyntaxException, IOException {

    List<Path> resu<
    // get path of the current running JAR
    String jarPath = getClass().getProtectionDomain()
            .getCodeSource()
            .getLocation()
            .toURI()
            .getPath();
    System.out.println("JAR Path :"   jarPath);

    // file walks JAR
    URI uri = URI.create("jar:file:"   jarPath);
    try (FileSystem fs = FileSystems.newFileSystem(uri, Collections.emptyMap())) {
        result = Files.walk(fs.getPath(folder)).filter(Files::isRegularFile).collect(Collectors.toList());
    }
    return resu<
}
 

Вот мой файл jnlp:

 <?xml version="1.0" encoding="utf-8"?> 
<jnlp spec="1.0 " codebase="http://localhost:8080/bsign/" href="bsign.jnlp">
    <information>
        <title>Jnlp Testing</title>
        <vendor>bermuda</vendor>
        <homepage href="http://localhost:8080/bsign/" />
        <description>jnlp Testing</description>
    </information>
    <security>
        <all-permissions/>
    </security>
    <resources>
        <j2se version="1.6 " />
        <jar href="bsignclient.jar" />

        <jar href="libs/commons-discovery-0.2.jar" />
        <jar href="libs/commons-io-2.8.0.jar" />
        <jar href="libs/commons-logging-1.1.1.jar" />
        .
        .
        .

    </resources>
    <application-desc main-class="com.bermuda.App" />
</jnlp>
 

Когда я пытаюсь запустить из jnlp, я получаю эту ошибку:

 java.nio.file.FileSystemNotFoundException: C:bsignbsignclient.jar
    at com.sun.nio.zipfs.ZipFileSystem.<init>(ZipFileSystem.java:120)
    at com.sun.nio.zipfs.ZipFileSystemProvider.newFileSystem(ZipFileSystemProvider.java:117)
    at java.nio.file.FileSystems.newFileSystem(Unknown Source)
    at java.nio.file.FileSystems.newFileSystem(Unknown Source)
    at com.bermuda.helpers.FileHelper.getPathsFromResourceJAR(FileHelper.java:138)
    at com.bermuda.helpers.FileHelper.extractResources(FileHelper.java:46)
    at com.bermuda.ui.MainMenu.<init>(MainMenu.java:54)
    at com.bermuda.ui.SysTray.<init>(SysTray.java:72)
    at com.bermuda.App.main(App.java:15)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.sun.javaws.Launcher.executeApplication(Unknown Source)
    at com.sun.javaws.Launcher.executeMainClass(Unknown Source)
    at com.sun.javaws.Launcher.doLaunchApp(Unknown Source)
    at com.sun.javaws.Launcher.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
 

из консоли:

 Missing Permissions manifest attribute in main jar: http://localhost:8080/bsign/bsignclient.jar
JAR Path :/bsign/bsignclient.jar
JAR Path :/bsign/bsignclient.jar
#### Java Web Start Error:
#### C:bsignbsignclient.jar
 

Поэтому, когда я помещаю свой jar сюда C:bsignbsignclient.jar , он извлекает файл. Но мне это не нужно, мне нужно извлечь этот файл из jnlp. Как я должен выполнить это извлечение из jar?

Комментарии:

1. «Как я должен выполнить это удаление из jar?» Получить URL доступ к встроенному ресурсу (независимо от того, находится ли он все еще в Jar или нет, web-start обрабатывается одинаково), получить InputStream для URL . Получить выходной поток для File . Выделите красным цветом байты входного потока и запишите их в выходной поток. Очистите выходной поток и закройте оба. / Fin

2. Кстати, JWS был удален в Java 9, поэтому я предполагаю, что вы используете более старую JRE. Я удивлен, что у достаточно потенциальных пользователей достаточно старых JRE для запуска этого материала или достаточно старых браузеров для его запуска.

3. Я использую Java 8, если пользователи используют более новые версии, есть открытый веб-запуск .

4. @AndrewThompson Я сделал это с URL -> InputStream помощью jnlp, который остается неизменным (запрашивает C:bsignbsignclient.jar ), а также jar не работает java.lang.IllegalArgumentException: Illegal character in path at index 25: C:/Users/Mali/Desktop/run desktop/bsign.jar/tokenconfig.json , он получает правильный путь, но не может записывать

5. Этот комментарий предполагает, что вы очень смущены. Опубликуйте код, который выдает указанные результаты.

Ответ №1:

Я поместил tokenconfig.json свой сервер в папку ресурсов. Я создал встроенный URL-адрес, например

String path = "http://localhost:8080/bsign/resources/tokenconfig.json"

     String path = "http://localhost:8080/bsign/resources/tokenconfig.json"
    downloadAndCopy(path);


    private void downloadAndCopy(String path){
        try {
            URL url = new URL(path);

            InputStream is = url.openStream();
            System.out.println("copying : "   path);

            FileUtils.copyInputStreamToFile(is, new File(path));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }