Могу ли я упаковать собственные библиотеки DLL в WAR? - PullRequest
4 голосов
/ 30 марта 2012

Я разрабатываю веб-сервис, который использует собственный код через JNI.Могу ли я упаковать эти DLL в мою войну?
Я устал управлять ими самостоятельно ...

PS Я использую Maven.
PPS Я использую Tomcat 7.x

Ответы [ 6 ]

4 голосов
/ 03 апреля 2012

Да, но есть куча проблем, с которыми вы столкнетесь.

  1. DLL загружаются из файловой системы, а не из пути к классам
    Это не является серьезной проблемой: просто сохраните DLL в вашей WAR как ресурс и скопируйте ее в папку в файловой системе. Свойство java.io.tmpdir должно указывать на доступный для записи каталог, или вы можете использовать File.createTempFile() (просто обязательно вызовите deleteOnExit() для этого файла). Тогда вы звоните System.load(), , а не System.loadLibary().

  2. Вы должны управлять разными копиями DLL для разных архитектур
    Если у вас есть полный контроль над развертыванием, и вы знаете, что вы будете когда-либо развертывать только на одной машине, тогда это не проблема. В противном случае вам нужно будет написать код, чтобы выяснить, какую библиотеку загружать.

  3. Вы можете загрузить общую библиотеку только один раз
    Это то, что причинит вам боль: когда вы загружаете разделяемую библиотеку, она связывается с исполняемым кодом JVM. Вы не можете перезагрузить ту же библиотеку, что означает, что вы не можете повторно развернуть.

Когда мне в последний раз приходилось загружать общую библиотеку для поддержки веб-приложения, я заканчивал тем, что помещал ее в общий каталог серверов приложений. Так было намного проще.

4 голосов
/ 30 марта 2012

Все от src/main/webapp упаковано для войны в корне, все от src/main/resources упаковано до WEB-INF/classes. Вы можете упаковать то, что вы хотите

3 голосов
/ 02 апреля 2012

Нет, ты не можешь.DLL должны быть загружены из файловой системы.Вам понадобится (1) чугунная гарантия того, что сервер приложений будет распаковывать WAR-файлы в файловую систему, и (2) знание того, куда именно DLL-файл будет распакован в файловой системе, чтобы вы могли вызвать System.load() справильное имя файла.

3 голосов
/ 30 марта 2012

Файлы DLL не загружаются через путь к классам.Механизм Classpath предназначен только для загрузки ресурсов Java, таких как файлы классов и другие файлы свойств.

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

2 голосов
/ 02 апреля 2012

Если у вашей зависимости нет <scope>provided</scope>, она будет включена в файл войны независимо от типа (jar, zip и т. Д., Если это не другая война).

Хотя это и так,Однако проблема заключается в том, что на вашем java.library.path должна быть встроенная библиотека (.so, .dll).Проблемы EJP действительны.Однако, если вы поэкспериментируете с плагином сборки и поместите dll в каталог /META-INF вашего военного файла, вы можете легко собрать некоторый код, который извлекает эту dll из пути к классам /META-INF/my.dll и помещает его в каталог наjava.library.path.

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

1 голос
/ 07 апреля 2013

@ carlspring: Вам повезет, что у вас есть доступ на запись в любой каталог в java.library.path.(т.е. Program Files \ Java и т. д.) Лучше было бы распаковать dll-файлы во временный каталог и добавить этот каталог в java.library.path во время выполнения.Это возможно: http://fahdshariff.blogspot.nl/2011/08/changing-java-library-path-at-runtime.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...