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
Как отмечено в комментариях, это работает, только если вы запустите команду из каталога, в котором находится 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
. Изменить: вы сказали, что имя файла не изменится, и этот ответ будет применяться, если вы знаете имя заранее, конечно, если вы предпочитаете его жестко.
Основываясь на ваших комментариях, я думаю, что вашим лучшим решением было бы передать абсолютный путь загруженного файла в банку.
Вы можете передать путь в банку в качестве аргумента командной строки. Поскольку путь и имя файла не изменяются, и вы запускаете его из linux, вы можете создать сценарий .sh для его запуска.
#!/bin/bash
java -jar myjar.jar /path/to/file/filename.txt
Это также освобождает вас от жесткого кодирования в пути к файлу, или имя файла в банке.
Чтобы сделать его «самодостаточным», поместите ресурс внутри Jar. Затем он становится встроенным ресурсом [только для чтения] , для которого мы можем получить URL-адрес, используя что-то по строкам:
URL url = this.getClass().getResource("/path/to/the.resource");
, если входное имя файла может быть жестко запрограммировано, и вы знаете, что он всегда будет находиться в том же каталоге, что и 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();
}
}
Вот как вы получаете чистый путь к файлу 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;
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.)
@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();
}
Вы можете получить местоположение файла JAR, содержащего какой-либо конкретный класс, с помощью:
URL url = thisClass.getProtectionDomain().getCodeSource().getLocation();
. Оттуда можно легко перевести URL-адрес в нужный файл.