Я изучал Maven в свободное время в течение несколько дней, но не могу понять, как организовать проект так, чтобы использовались библиотеки JOGL. Я бы предпочел следующее:
Я думаю, что отчасти моя проблема в том, что я не совсем понимаю использование JOGL, где разместить собственные библиотеки при запуске кода и т. д. Мне нужно вернуться к основам и написать приветственный мир JOGL, скомпилировать его из командной строки и запустить из командной строки, чтобы точно увидеть, что ему требуется, в том, что касается размещения в каталоге собственных библиотек ; На самом деле, я могу пойти и сделать это прямо сейчас.
С помощью пункта 1 я обнаружил некоторые особенности ОС; Профили Maven можно активировать на основе свойств системы, в которую входит операционная система. Итак, я мог активировать профиль Windows, который зависит от специфической для Windows библиотеки JOGL, такой же для Linux, и у обоих есть 64-битное альтер-эго. (Активация официальная документация / неофициальная документация .)
Я попытался создать репозиторий Maven на основе файла JOGL jar, а затем добавить проект файла JOGL jar как зависимость от мой проект; зависимость загружается, но не используется. Я понятия не имею, где находится jar-файл, как его использовать, распаковывать и т. Д. Вот команда, которую я использовал.
Итак, вкратце: JOGL состоит из четырех файлов .jar и некоторых собственных библиотек.Как мне интегрировать эти файлы в мой проект Maven, чтобы я мог написать приложение JOGL с Maven, обрабатывающим мой процесс сборки? Кроме того, как я могу использовать другой набор файлов в зависимости от операционной системы, потому что, конечно, родная библиотеки и даже файлы .jar различаются в Windows, Linux и Mac.
При работе с JNI и Maven, Projects With JNI is is the reference should start with. Она охватывает намного больше, чем ваша текущая проблема (которая заключается в "простоте" использования библиотеки, которая полагается на JNI и родные библиотеки), но, ну, тот, кто может сделать больше, может сделать меньше.
Если вы внимательно прочитаете его, то увидите, что одним из решений для использования библиотек JNI является объединение их в JAR-архитектуру, чтобы вы могли зависеть от них, как и от любых других зависимостей с точки зрения Maven. На самом деле, так упакована JOGL версия 1.1.1 в http://download.java.net/maven/2/net/java/dev/jogl/, есть один артефакт JAR с классами Java и несколько артефактов JAR, специфичных для архитектуры, с родными библиотеками.
Библиотека JNI, заархивированная в банке
Решение, которое я в итоге использовал, заключалось в том, чтобы хранить скомпилированную библиотеку jni в jar рядом с файлами классов.
Это означает либо кросс-компиляцию для все возможные архитектуры, или более просто, имея другую банку для каждая архитектура. Эта последняя подходит довольно хорошо с нашей установкой - где почти все наши машины Linux-i386, с небольшим выигрышем32 коробки.
К сожалению
System.load()
не может справиться с загрузка библиотек из банки, поэтому нам понадобится обычай загрузчик, который извлекает библиотеку в временный файл во время выполнения; это Однако, очевидно, это достижимо.
Тогда, как было объяснено, идея заключается в использовании пользовательского загрузчика библиотек для загрузки родной библиотеки. Хорошая новость заключается в том, что такой загрузчик "предоставляется", как объяснено ниже.
Загрузчик библиотек
Теперь у нас есть JNI библиотека на классовый путь, так что нам нужен способ Загружаю. Я создал отдельный проект, который позволит извлечь JNI библиотеки по пути класса, затем Загрузить их. Найти их http://opensource.mxtelecom.com/maven/repo/com/wapmx/native/mx-native-loader/1.2/. Это добавляется как зависимость от Пом, очевидно.
Чтобы использовать его, позвоните...
com.wapmx.nativeutils.jniloader.NativeLoader.loadLibrary(libname)
. Дополнительная информация находится в javadoc дляNativeLoader
.Обычно я предпочитаю заворачивать такие вещи. в блоке try/catch следующим образом:
public class Sqrt { статическое электричество пытаться NativeLoader.loadLibrary("sqrt"); } catch (Throwable e) { e.printStackTrace(); System.exit(1); } } /* ... тело класса... */ }
Сейчас мы должны быть на том этапе, когда наши тесты на смешение работают от maven; a mvn тест должен сработать! Он также должен работать Прекрасно из IDE.
Теперь, чтобы ответить на ваши вопросы, как:
Автоматически загрузить, при необходимости, специфичный для операционной системы zip-файл JOGL отсюда (содержит 4 jar-файла и некоторые файлы родной библиотеки (.so/.dll)); или зависит от проекта Maven, который является оберткой одного из файлов.
К сожалению, JOGL 2.0 jars не доступны в репозитории Maven java.net, поэтому вам придется разобраться с этим и либо сделать их доступными в частном репозитории, либо установить их вручную в локальном репозитории каждого разработчика. Для этого используйте mvn install:install-file
, как описано в Руководстве по установке сторонних JAR (а не mvn deployment:deploymenty-file
, как это было сделано, эта цель используется для установки артефактов в удаленный репозиторий). Лично я бы загрузил JOGL 2.0 ZIP-файлы с URL, который вы предоставили, упаковал его так же, как и JOGL 1.1.1 (один Java JAR и несколько специфических JAR для родных библиотек) и установил бы JAR-файлы в каждый локальный репозиторий на данный момент. Затем, объявите стандартную зависимость от артефакта Java и, действительно, используйте профили для специфических для архитектуры зависимостей. Что-то вроде этого:
<project>
...
<dependencies>
<dependency>
<groupId>net.java.dev.jogl</groupId>
<artifactId>jogl</artifactId>
<version>2.0-beta10</version>
</dependency>
...
</dependencies>
...
<profiles>
<profile>
<id>linux-i586</id>
<activation>
<os>
<arch>i386</arch>
<family>unix</family>
<name>linux</name>
</os>
</activation>
<dependencies>
<dependency>
<groupId>net.java.dev.jogl.jogl-linux-i586</groupId>
<artifactId>jogl-linux-i586</artifactId>
<version>2.0-beta10</version>
</dependency>
</dependencies>
</profile>
...
</profiles>
...
</project>
Не забудьте добавить репозиторий, необходимый для загрузчика пользовательской библиотеки и зависимость:
<project>
<repositories>
<repository>
<id>opensource.mxtelecom.com</id>
<url>http://opensource.mxtelecom.com/maven/repo</url>
</repository>
...
<repositories>
...
<dependencies>
<dependency>
<groupId>com.wapmx.native</groupId>
<artifactId>mx-native-loader</artifactId>
<version>1.2</version>
</dependency>
...
</dependencies>
...
</project>
Относительно второй части вашего вопроса:
Распакуйте этот zip-файл соответствующим образом, чтобы (...)
Как я уже объяснял, на самом деле вы будете зависеть не от ZIP-файлов, а от JAR-файлов, и вам не придется их распаковывать ни во время разработки, ни для распространения вашего проекта. Для дистрибутива вам просто нужно будет создать банку с зависимостями. Это можно сделать с помощью maven-assembly-plugin. Смотрите, например, этот ответ .
.Я не знаю библиотеку JOGL, но у меня есть опыт работы с Java3d, который имеет те же проблемы с установкой/сборкой. Есть два способа добиться этого:
сказать разработчикам, чтобы они устанавливали JOGL без помощи, а затем относиться к JOGL-библиотекам как к системным зависимостям, как мы делаем это с Java3d
<зависимость>.
javax.java3d
j3dcore
<версия>1.5.1версия>
<скоп>системаскоп>
${java.home}/lib/ext/j3dcore.jar
зависимость>
поместите все банки и системно-зависимые библиотеки в собственный репозиторий и создайте для них подходящие poms
Если вы сильно хотите автоматизировать установку JOGL в Maven, вы можете попробовать использовать maven-antrun-plugin или создать собственный плагин Maven, который обрабатывает установку (хорошим примером является Cargo, который загружает серверы и распаковывает их).
Я рассматриваю возможность использования первого варианта - скажите разработчикам установить JOGL. В нашем случае Java3d приложение распространяется Java WebStart, поэтому для них установка Java3d полностью автоматизирована WebStart.
.Нет простого способа сделать это. Попробуйте настроить maven-assembly-plugin на сборку исполняемой банки и упаковать нужные файлы с вашим кодом. Вы не можете использовать управление зависимостями maven для достижения этой цели, потому что вам нужно содержимое ZIP, а не сам ZIP. Вы можете попробовать maven-ant-plugin.
.Здесь, для справки, находится часть моего файла Ant build.xml, который загружает и распаковывает библиотеку JOGL (2.0 beta 10).
<target name="libraries" depends="libraries.jogl" />
<target name="libraries.jogl.check">
<condition property="libraries.jogl.exists">
<available file="lib/jogl" />
</condition>
</target>
<target name="libraries.jogl" depends="libraries.jogl.check" unless="libraries.jogl.exists">
<condition property="joglostype" value="windows-i586">
<and>
<os family="windows" />
<or>
<os arch="i386" />
<os arch="x86" />
</or>
</and>
</condition>
<condition property="joglostype" value="windows-amd64">
<and>
<os family="windows" />
<os arch="amd64" />
</and>
</condition>
<condition property="joglostype" value="linux-i586">
<and>
<os name="Linux" />
<or>
<os arch="i386" />
<os arch="x86" />
</or>
</and>
</condition>
<condition property="joglostype" value="linux-amd64">
<and>
<os name="Linux" />
<or>
<os arch="AMD64" />
<os arch="x86_64" />
</or>
</and>
</condition>
<echo>Detected operating system: ${joglostype}</echo>
<echo>(if invalid OS, update ant build file)</echo>
<mkdir dir="lib" />
<get src="http://download.java.net/media/jogl/builds/archive/jsr-231-2.0-beta10/jogl-2.0-${joglostype}.zip" dest="lib/jogl.zip" usetimestamp="true" />
<mkdir dir="lib/jogl" />
<unzip src="lib/jogl.zip" dest="lib/jogl">
<patternset>
<include name="**/gluegen-rt.jar" />
<include name="**/jogl.all.jar" />
<include name="**/nativewindow.all.jar" />
<include name="**/newt.all.jar" />
<include name="**/*.so" />
<include name="**/*.dll" />
</patternset>
<mapper type="flatten" />
</unzip>
</target>