Как получить путь к исполняемому файлу при использовании launch4j?

Я использую launch4j для переноса исполняемого файла jar в свое приложение Windows, но мне нужно передать ссылки на некоторые из его библиотек через аргументы JVM. Рассматриваемые библиотеки находятся в каталоге установки приложения и всегда находятся в одном и том же месте относительно исполняемого файла.

Я хотел бы сказать launch4j использовать относительные пути к исполняемому файлу в параметрах JVM. Я знаю, что эта информация доступна на уровне пакетного сценария Windows, но как настроить launch4j для ее получения?

Изменить для уточнения: я специально ищу, как сделать пути относительно самого двоичного файла, не как сделать их относительно текущего рабочего каталога. Эти два не обязательно одинаковы.


person Community    schedule 27.02.2012    source источник
comment
Я не знаю, почему вы хотите вызывать jar-файлы через аргументы виртуальной машины из средства запуска Launch4J. Launch4J может встроить их в исполняемый файл. Добавьте имена jar-файлов в список Путь к классам на вкладке Путь к классам графического интерфейса Launch4J. Если банки находятся в папке относительно пути установки приложения, добавьте к каждой банке префикс пути к папке. Например: папка ./lib содержит все внешние банки, а основной класс находится в ./; поэтому введите ./lib/myexternal-1.0.jar в списке путей к классам.   -  person ecle    schedule 28.02.2012
comment
Поскольку это не банки, это нативные библиотеки. Что касается именно того, что мне нужно загрузить таким образом, во-первых, я использую браузер SWT и хочу, чтобы он загружал конкретную установку XULRunner (в комплекте). Для этого вам нужно установить org.eclipse.swt.browser.XULRunnerPath. Во-вторых, есть родная dll, используемая моим собственным кодом, которую мне нужно загрузить. Я хочу установить java.library.path для этого.   -  person    schedule 29.02.2012
comment
Вы пробовали System.getProperties().list(System.out) (user.dir) и System.env?   -  person Joop Eggen    schedule 01.03.2012
comment
Установите -Djna.library.path=<relative path of native libraries> (при использовании JNA) и -Djava.library.path=<relative path of native libraries>. Или вы можете поместить это в список опций Launch4J JVM на вкладке JRE. Это то, что я делаю в своих проектах.   -  person ecle    schedule 01.03.2012
comment
@JoopEggen Свойство user.dir — это текущий рабочий каталог, а не местонахождение исполняемого файла.   -  person    schedule 01.03.2012
comment
@eee Да, но проблема в том, что мне нужен путь.   -  person    schedule 01.03.2012


Ответы (5)


Вы можете добавить в свою конфигурацию launch4j

...
<jre>
...
<opt>-Djna.library.path="%EXEDIR%\\path\\to\\lib"</opt>
<opt>-Djava.library.path="%EXEDIR%\\path\\to\\lib"</opt>
...
</jre>
...

Если вам нужно больше, чем a, вы можете, как обычно, разделить несколько путей точкой с запятой.

‹ opt> Необязательный, принимает все, что вы обычно передаете в программу запуска java/javaw: параметры утверждения, системные свойства и параметры X. Здесь вы можете сопоставить среду и специальные переменные EXEDIR (каталог времени выполнения exe), EXEFILE (полный путь к файлу времени выполнения exe) со свойствами системы. Все ссылки на переменные должны быть окружены знаками процента и заключены в кавычки.

Источник: http://launch4j.sourceforge.net/docs.html

person wallnuss    schedule 01.03.2012

Установите -Djna.library.path=<relative path of native libraries> (при использовании JNA) и -Djava.library.path=<relative path of native libraries>.

В качестве альтернативы это можно сделать в коде Java как: System.setProperty("jna.library.path","<relative path of native libraries>") и System.setProperty("java.library.path","<relative path of native libraries>"). Вы можете добавить столько путей, чтобы ссылаться на них. В Windows используйте ; для разделения путей.

Эта настройка влияет только на среду выполнения JVM этого Java-приложения (не глобально, как LD_LIBRARY_PATH в Linux).

Или вы можете поместить это в список Launch4J Параметры JVM на вкладке JRE. Это то, что я делаю в своих проектах.

person ecle    schedule 01.03.2012
comment
Как мне получить бинарно-относительные пути? - person ; 01.03.2012
comment
В моем случае, будучи ленивым, я просто поместил собственные библиотеки и зависимые jar-файлы в ту же папку, что и исполняемый файл, и установил -Djava.library.path=.\\ . Я даже связываю JVM в той же папке и соответствующим образом ссылаюсь на него в моем файле сценария Launch4J <jre><path>jre6</path></jre> - person ecle; 01.03.2012
comment
Это не работает, если бинарный файл вызывается из другого каталога. Вот почему мне нужны двоично-относительные пути. - person ; 01.03.2012
comment
@RyanArcher Я никогда не сталкивался с какими-либо проблемами при подготовке сценария Launch4J и структуры папок приложения. Более того, я использую переменную среды для хранения/получения пути к приложению в своих кодах Java. Что вы имеете в виду под двоичным кодом: собственные библиотеки DLL? - person ecle; 01.03.2012
comment
Если у вас есть двоичный файл в другой подпапке по пути к приложению, просто добавьте подпапку: -Djava.library.path=.\\;.\\subfolder так же, как мы устанавливаем переменную среды Windows PATH - person ecle; 01.03.2012
comment
Я имею в виду, что мне нужен способ получить путь относительно того места, где на самом деле находится исполняемый файл в файловой системе, в отличие от любого каталога, открытого пользователем в данный момент. Итак, если абсолютный путь времени выполнения двоичного файла C:\application\bin\app.exe, я хочу что-то, что будет оцениваться как C:\application\bin\, даже если исполняемый файл вызывается из C:\some\other \каталог\. Эта информация доступна в сценариях оболочки Windows, но мне еще предстоит найти способ заставить launch4j предоставить ее вам. - person ; 01.03.2012
comment
Вы можете добавить C:\application\bin\ в список -Djava.library.path, и JVM попытается найти двоичный файл из списка, учитывая, что путь является фиксированным путем к вашему двоичному файлу. Но кажется, что ваш путь устанавливается динамически там, где это трудно сделать. - person ecle; 01.03.2012
comment
Переменная пакетного файла для получения этой информации — %~dp0%, которая соответствует каталогу, содержащему сценарий оболочки. Таким образом, для приложения, в котором сценарий запуска находится в \bin, а библиотеки — в \lib, вы можете выполнить -Djava.library.path="%~dp0%..\lib" и всегда находить свои библиотеки, независимо от фактического пути установки во время выполнения или рабочего каталога. - person ; 09.03.2012
comment
%~dp0% работает только с интерпретатором команд DOS, запущенным из командной строки DOS, и не работает внутри JVM. Но вы можете передать это как аргумент точки входа args основного приложения и использовать интерпретируемое командой значение %~dp0% в качестве значения системного свойства java.library.path. Однако решение walnus - это то, что вам действительно нужно, которое использует Launch4J EXEDIR для представления текущего каталога запуска. - person ecle; 09.03.2012

Один из вариантов в конфигурации — разрешить изменение каталога chdir на каталог исполняемых файлов. Это установит user.dir в тот же каталог, что и exe, который вы можете использовать для поиска других путей приложения.

<chdir>

По желанию. Измените текущий каталог на произвольный путь относительно исполняемого файла. Если вы опустите это свойство или оставите его пустым, оно не будет иметь никакого эффекта.

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

<chdir>.</chdir>
<chdir>../somedir</chdir>

Код, который находит фактический путь к исполняемому файлу, будет зависеть от ОС (readlink, GetModuleFileName и т. д.). Убедитесь, что вы действительно тестируете целевые ОС.

person Jayan    schedule 06.03.2012

Если я правильно понял ваш вопрос, у вас есть исполняемый файл launch4j и собственная библиотека в вашем установочном каталоге:

/launch.exe
/bin/lib.dll
/lib/app.jar

Теперь вы хотите запустить app.jar со сгенерированным лаунчером (launch.exe). Ваше приложение загружает lib.dll.

Вы можете встроить файл в свой app.jar (marker.txt). Теперь вы можете использовать ClassLoader

http://docs.oracle.com/javase/6/docs/api/java/lang/ClassLoader.html#getResource(java.lang.String)

getResource("marker.txt);

Это даст вам что-то вроде:

file://c://installdir/lib/app.jar!marker.txt

Эта строка может быть проанализирована. Но на самом деле, я думаю, должно быть лучшее решение этой проблемы.

person Christian Kuetbach    schedule 29.02.2012
comment
Это получает текущий рабочий каталог, который не обязательно находится там, где находится исполняемый файл. - person ; 01.03.2012
comment
Хм, умница. Я не думал использовать загрузчик классов, чтобы получить путь. Это может сработать, хотя я немного беспокоюсь, что после запуска Java все не примет системное свойство. Я должен провести расследование. - person ; 01.03.2012
comment
Насколько я знаю, вы не можете установить System.properties через JAVA. Они доступны только для чтения. На самом деле вам не нужно их устанавливать, потому что вы можете создать абсолютный путь к вашей dll и загрузить ее (сравните System.loda() и System.loadLibrary() друг с другом java-doc) - person Christian Kuetbach; 01.03.2012

Вы можете просто указать каталог (например, ..\lib), в котором находятся библиотеки, на вкладке пути к классам в Launch4j. По крайней мере, это сработало для меня.

person Durandal    schedule 05.03.2012