Сделать мою программу на Java легко распространяемой

Я установил Java 3D API на ПК с помощью установщика exe, который просто создал новый каталог с j3dcore.jar, vecmath.jar, j3dutils.jar в подкаталоге lib и j3dcore-ogl.dll в подкаталоге bin.

У Netbeans не было проблем, и мой код компилировался и выполнялся гладко, однако, как только я построил свой проект и попытался запустить его из командной строки, я получил UnsatisfiedLinkError, говорящий, что no j3dcore-ogl in java.library.path.

На помощь пришел Google и дал мне 3 жизнеспособных решения:

  • скопировав файл dll в каталог bin моей JRE
  • добавив путь к файлу dll в путь к библиотеке (java -Djava.library.path=dllpath)
  • загрузите dll в программу с помощью System.load() (на самом деле я не смог заставить это работать)

Мой вопрос: есть ли элегантное решение этой проблемы, которое я пропустил?

Кажется утомительным, что для каждого другого ПК, на котором кто-то хотел бы использовать эту программу, ему пришлось бы либо скопировать dll, либо добавить ее в путь к библиотеке, прежде чем она сможет работать. (Дополнительный вопрос: почему у Netbeans не было проблем с dll?)


person István Kohn    schedule 20.05.2011    source источник
comment
Судя по названию (APi), это не отдельная программа, а библиотека, которую вы можете использовать в своих собственных java-приложениях.   -  person Richard H    schedule 20.05.2011
comment
для этого и нужны установщики...   -  person    schedule 20.05.2011
comment
Может быть, я не совсем ясно выразился: даже на моем собственном ПК, на котором я установил Java3D, была эта проблема вне Netbeans.   -  person István Kohn    schedule 20.05.2011


Ответы (4)


Правка. После повторного прочтения вопроса ваша проблема звучит по-другому. Однако я могу заставить себя работать так, просто перетащив все файлы dll в тот же каталог, что и файл .bat, запускающий процесс java:

java -classpath ./YourJar.jar;./lib/j3dcore.jar;./lib/vecmath.jar;./lib/j3dutils.jar package.MainClass

И это работает на компьютерах нескольких пользователей, так что я знаю, что достаточно просто поместить его в рабочий каталог.

Я считаю, что это зависит от используемой версии Java - 64-битной или 32-битной. Правильный файл dll (с таким же именем) должен находиться в рабочем каталоге.

Я думаю, что у меня возникла аналогичная проблема, когда использовалась неправильная dll, и она не зависит от ОС (если в вашей 64-разрядной ОС установлена ​​32-разрядная Java, вам понадобится 32-разрядный файл j3dcore-ogl.dll).

Итак, вопрос в том, какую версию Java вы используете (при работе вне вашей IDE) и какую версию dll вы помещаете (если есть) в рабочий каталог? Мне не нужны файлы dll в настройках моего пути, чтобы это работало на других ПК, и я не использовал System.load() и НЕ копировал файлы в каталог JRE/bin моего пользователя, поэтому я знаю, что это возможно без 3 варианта, которые вы упомянули.

person Manius    schedule 17.06.2011
comment
Кстати, также для решения проблемы с 32-64-битной версией, я думаю, вам придется скопировать соответствующую версию dll в рабочий каталог с ожидаемым именем. Немного запутанный, но достаточно автоматический для пользователя, так что для запуска по-прежнему достаточно двойного щелчка .bat. - person Manius; 17.06.2011
comment
Кроме того, если вы уже пытались поместить файл dll в рабочий каталог, из которого вы работаете, посмотрите внимательно. Я сделал это, забыв добавить 3 другие зависимости dll, и получил очень похожую ошибку с упоминанием другой dll, которую я принял за исходное сообщение об ошибке для первой dll. Мне пришлось немного почесать голову, чтобы понять это. После того, как я закинул остальные в рабочий каталог, все работает нормально, и на моих пользовательских ПК тоже. - person Manius; 17.06.2011

Сделать мою программу на Java легко распространяемой

Если вы имеете в виду «простой для конечного пользователя», посмотрите на Java Web Start.


Прохожий спрашивает:

Можете ли вы упаковать зависимости dll с помощью Web Start?

Да, но намного, намного лучше. Вы можете упаковать нативы для каждой платформы в отдельные JAR-файлы и предоставить их только той платформе, которая использует этот натив, даже если разделять загрузку между 32- и 64-битными версиями нативов.

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

Все это происходит автоматически для конечного пользователя, он щелкает ссылку, подтверждает диалог(и) о доверии, когда его спрашивают, и приложение устанавливается – возможно, с интеграцией с настольным компьютером, и появляется на экране как по волшебству.

JWS-приложения. которые используют нативы, должны распространяться как уровень безопасности all-permissions, потому что JVM не может гарантировать действия всего, что «становится нативным».

person Andrew Thompson    schedule 20.05.2011
comment
Можете ли вы упаковать зависимости dll с помощью Web Start? Я предполагаю, что вы можете (?), но без этого большинство пользователей не будут счастливы. - person Manius; 17.06.2011
comment
Хорошее шоу. Вероятно, сложнее заставить работать правильно, но «лучше, чем .bat». - person Manius; 17.06.2011
comment
@Crusader: Вероятно, сложнее работать правильно, .. Слишком чертовски правильно! Вся эта простота для конечного пользователя дорого обходится разработчику. ;) Но тогда, хотя изначально это «стоит» больше времени и усилий, в долгосрочной перспективе это значительно экономит «расходы на поддержку». - person Andrew Thompson; 17.06.2011

Если вы поместите dll в тот же каталог, что и Jar, это сработает? Если да, вы могли бы рассмотреть возможность распространения его таким образом.

person Vincent Cantin    schedule 20.05.2011
comment
У меня была такая идея. Попытался вставить dll с 3 j3d jar-файлами, которые все равно нужно распространять, и загрузить ее в свой код с помощью System.load(), к сожалению, это не сработало. - person István Kohn; 20.05.2011

Я предполагаю, что DLL ищутся во всех папках в% PATH% в Windows. (LD_LIBRARY_PATH для разновидностей UNIX)

Не могли бы вы попробовать добавить путь к dll в переменную %path%?

Похоже, вы пытаетесь упаковать продукт со многими jar-файлами в качестве зависимостей. Вы можете воспользоваться One-Jar. Он утверждает, что имеет встроенную поддержку dll.

person Jayan    schedule 20.05.2011