JAVA - использовать файл config.properties после переноса с помощью Launch4j [duplicate]

public class StaticInitializationBlock {

    static int staticVariable;
    int instanceVariable;

    // Static Initialization Block
    static { 
        System.out.println("Static block");
        staticVariable = 5;

    }

    // Instance Initialization Block
    { 

        instanceVariable = 7;
        System.out.println("Instance Block");
        System.out.println(staticVariable);
        System.out.println(instanceVariable);

        staticVariable = 10;
    }


    public StaticInitializationBlock() { 

        System.out.println("Constructor");
    }

    public static void main(String[] args) {
        new StaticInitializationBlock();
        new StaticInitializationBlock();
    }

}

Выход:

Static block
Instance Block
5
7
Constructor
Instance Block
10
7
Constructor
15
задан shinjuo 19 February 2013 в 23:28
поделиться

8 ответов

Как отмечено в комментариях, это работает, только если вы запустите команду из каталога, в котором находится jar.

(В контексте настольного приложения) Для доступа файл, находящийся в текущем каталоге jar, вашему path файлу должна предшествовать точка. Пример:

String path = "./properties.txt";
FileInputStream fis = new FileInputStream(path);
BufferedReader in = new BufferedReader(new InputStreamReader(fis));
// Read the file contents...

В этом примере есть текстовый файл с именем properties.txt в том же каталоге, что и jar. Этот файл будет прочитан программой, содержащейся в jar. Изменить: вы сказали, что имя файла не изменится, и этот ответ будет применяться, если вы знаете имя заранее, конечно, если вы предпочитаете его жестко.

16
ответ дан afsantos 26 August 2018 в 08:36
поделиться

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

Вы можете передать путь в банку в качестве аргумента командной строки. Поскольку путь и имя файла не изменяются, и вы запускаете его из linux, вы можете создать сценарий .sh для его запуска.

#!/bin/bash    
java -jar myjar.jar /path/to/file/filename.txt

Это также освобождает вас от жесткого кодирования в пути к файлу, или имя файла в банке.

0
ответ дан aglassman 26 August 2018 в 08:36
поделиться

Чтобы сделать его «самодостаточным», поместите ресурс внутри Jar. Затем он становится встроенным ресурсом [только для чтения] , для которого мы можем получить URL-адрес, используя что-то по строкам:

URL url = this.getClass().getResource("/path/to/the.resource");
1
ответ дан Community 26 August 2018 в 08:36
поделиться

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

public static void main(String[] args) {

    try {
        // Determine where the input file is; assuming it's in the same directory as the jar
        String fileName = "input.txt";
        File jarFile = new File(Main.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath());
        String inputFilePath = jarFile.getParent() + File.separator + fileName;         
        FileInputStream inStream = new FileInputStream(new File(inputFilePath));

        try {

            // Read in the contents of the input file in a single gulp
            FileChannel fc = inStream.getChannel();
            MappedByteBuffer bb = fc.map(FileChannel.MapMode.READ_ONLY, 0,
                    fc.size());

            // Do something with the read in data
            System.out.println(Charset.defaultCharset().decode(bb)
                    .toString());
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            inStream.close();
        }

    } catch (IOException | URISyntaxException e) {
        e.printStackTrace();
    }

}
2
ответ дан Darwyn 26 August 2018 в 08:36
поделиться

Вот как вы получаете чистый путь к файлу jar (на основе ответа EJP):

URL url = IssueInfoController.class.getProtectionDomain().getCodeSource().getLocation();
String urlString = url.toString();
int firstSlash =  urlString.indexOf("/");
int targetSlash = urlString.lastIndexOf("/", urlString.length() - 2) + 1;

return urlString.substring(firstSlash, targetSlash) + YOUR_FILE;
0
ответ дан Herberts Markūns 26 August 2018 в 08:36
поделиться
public class TestClassLoaderAccess {
    public static void main(String[] argv) {
        TestClassLoaderAccess me = new TestClassLoaderAccess();
        ClassLoader myLoader = me.getClass().getClassLoader();
        System.out.println(myLoader.getClass().getSuperclass().getName());
        java.net.URLClassLoader myUrlLoader = (java.net.URLClassLoader) myLoader;
        java.net.URL resource = myUrlLoader.findResource("TestClassLoaderAccess.class");
        System.out.println(resource.toString());
    }
}

Запуск:

C:\JavaTools>javac TestClassLoaderAccess.java

C:\JavaTools>java TestClassLoaderAccess
java.net.URLClassLoader
file:/C:/JavaTools/TestClassLoaderAccess.class

C:\JavaTools>

(Первый println - это просто доказать, что загрузчик классов является подклассом URLClassLoader.)

-1
ответ дан Hot Licks 26 August 2018 в 08:36
поделиться

@kcpr - Спасибо за предоставленные решения. Ниже я работал для меня.

private static String CONFIG_FILE_LOCATION = "lib"+ File.separator + "Config.properties";

static {
    File jarFile = new File(Main.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath());
    String inputFilePath = jarFile.getParent() + File.separator + CONFIG_FILE_LOCATION; 
    propConfig = new PropertiesConfiguration(new File(inputFilePath));
    propConfig.load();
}
2
ответ дан Meloman 26 August 2018 в 08:36
поделиться

Вы можете получить местоположение файла JAR, содержащего какой-либо конкретный класс, с помощью:

URL url = thisClass.getProtectionDomain().getCodeSource().getLocation();

. Оттуда можно легко перевести URL-адрес в нужный файл.

21
ответ дан user207421 26 August 2018 в 08:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: