Как получить путь к исполняемому файлу при использовании launch4j? - PullRequest
8 голосов
/ 27 февраля 2012

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

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

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

Ответы [ 5 ]

11 голосов
/ 01 марта 2012

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

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

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

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

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

3 голосов
/ 01 марта 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 .Это то, что я делаю в своих проектах.

2 голосов
/ 06 марта 2012

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

<chdir>

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

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

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

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

1 голос
/ 05 марта 2012

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

1 голос
/ 01 марта 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

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

...