Что касается теперь, функциональные языки не используются в большой степени для промышленных проектов, таким образом, недостаточно серьезной работы входит в оптимизаторы. Кроме того, оптимизация обязательного кода для обязательной цели является, вероятно, легче путем.
Функциональные языки имеют один подвиг, который позволит им превзойти императивные языки действительно скоро теперь: тривиальное распараллеливание.
Тривиальный не в том смысле, что это легко, но что это может быть встроено в языковую среду без разработчика, бывшего должного думать об этом.
стоимость устойчивой многопоточности на агностическом потоком языке как C является чрезмерной многим проектам.
Это немного смущает, но решение было просто использовать 64-битный JDK в 64-битной системе. Я скопировал все со своей старой машины, что означало также 32-битный JDK, и в этом была проблема. Он работал должным образом с 64-разрядной средой выполнения.
Извините за беспокойство.
Обходной путь, а не решение. Вы можете установить его, добавив в качестве аргумента -Duser.home = $ HOME
.
java -Duser.home=$HOME Test
А как насчет других гарантированных свойств? Что произойдет, если вы вызовете что-то вроде следующего?
public static void printAllGuaranteedProperties() {
printAProperty ("java.version", "Java version number");
printAProperty ("java.vendor", "Java vendor specific string");
printAProperty ("java.vendor.url", "Java vendor URL");
printAProperty ("java.home", "Java installation directory");
printAProperty ("java.class.version", "Java class version number");
printAProperty ("java.class.path", "Java classpath");
printAProperty ("os.name", "Operating System Name");
printAProperty ("os.arch", "Operating System Architecture");
printAProperty ("os.version", "Operating System Version");
printAProperty ("file.separator", "File separator");
printAProperty ("path.separator", "Path separator");
printAProperty ("line.separator", "Line separator");
printAProperty ("user.name", "User account name");
printAProperty ("user.home", "User home directory");
printAProperty ("user.dir", "User's current working directory");
}
public static void printAProperty (String propName, String desc) {
System.out.println ("Value for '" + desc + "' is '" + System.getProperty(propName) + "'.");
}
wds находится прямо в его / ее комментарии . Значение user.home
похоже взято из / etc / passwd.
Какая у вас строка в / etc / passwd
для вашего пользователя?
Если я изменил запись на / home / nonexisting
, класс Test
напечатал / home / nonexisting
. У вас случайно есть ?
в / etc / passwd?
Это действительно интересно. Похоже, что свойство user.home
не взято из переменной среды $ HOME.
Я пробовал это:
$ echo $HOME && java Test && unset HOME && echo $HOME && java Test
/home/grzole
/home/grzole
/home/grzole
Обратите внимание, что оболочка забывает значение переменной HOME, а Java - нет.
EDIT:
Я подозреваю, что Java просто берет префикс / home /
и добавляет имя пользователя.
Подумайте вот о чем:
# adduser b
...
# rm -fr /home/b
# su - b
No directory, logging in with HOME=/
$ cd /tmp/jb
$ java Test
/home/b
Может быть, у вас вообще нет каталога / home
в вашей файловой системе?
Need to pore through the native code to figure out what exactly is happening. The user.home variable is set by the "PAM" modules in Linux systems and if the module in use generates these dynamically and the Java implementation is trying to get the value without explicitly using PAM then the behaviour is unpredictable hence the "?"