Maven и библиотека JOGL?
Я изучаю Maven в свободное время в течение последних нескольких дней, но не могу понять, как организовать проект, чтобы использовать библиотеки JOGL. Я бы предпочел следующее:
- Автоматически загружать, при необходимости, ZIP файл JOGL для ОС из здесь (содержит 4 файла jar и некоторые файлы собственных файлов (.so/.dll)); или зависит от проекта Maven, который является оберткой одного из файлов.
- Разархивируйте этот zip файл соответствующим образом, чтобы:
- файлы jar добавляются в путь к классам и развертываются по мере необходимости, а
- файлы исходной библиотеки добавляются в последний файл jar (это позволит им автоматически использовать или мне нужно что-то более активное?)
Я думаю, что часть моей проблемы заключается в том, что я не полностью понимаю использование JOGL, где размещать собственные библиотеки при запуске кода и т.д. Мне нужно вернуться к основам и написать мир приветствия JOGL, скомпилировать его из командной строки и запустить из командной строки, чтобы увидеть, что именно требуется для размещения каталогов на родных библиотеках; На самом деле я могу сделать это прямо сейчас.
В пункте 1 я нашел некоторые особенности, связанные с ОС; Профили Maven могут быть активированы на основе свойств системы, которые включают операционную систему. Итак, я могу активировать профиль Windows, который имеет зависимость от библиотеки JOGL для Windows, то же самое для Linux, и у обоих есть 64-битное альтернативное эго. (Активация официальные документы/неофициальные документы.)
Я попытался создать репозиторий Maven на основе jar файла JOGL, а затем добавить проект jar файла JOGL в качестве зависимости от моего проекта; зависимость загружается, но не используется. Я понятия не имею, куда идет файл jar или как его использовать, распаковать его и т.д. Вот команда, которую я использовал.
Итак, короче: JOGL состоит из четырех файлов .jar и некоторых собственных библиотек. Как интегрировать эти файлы в мой проект Maven, чтобы я мог написать приложение JOGL с Maven, обрабатывающим мой процесс сборки?. Кроме того, как я могу использовать другой набор файлов в зависимости от операционной системы, родные библиотеки и даже файлы .jar различаются между Windows, Linux и Mac.
Ответы
Ответ 1
Jogamp теперь содержит поддержку Maven, для компонентов jogl (ожидается поддержка jocl и joal). Начиная с версии 2.0-rc11 пакеты помещаются в Maven Central.
Просто поставьте это на свой pom:
<dependencies>
<dependency>
<groupId>org.jogamp.gluegen</groupId>
<artifactId>gluegen-rt-main</artifactId>
<version>2.0-rc11</version>
</dependency>
<dependency>
<groupId>org.jogamp.jogl</groupId>
<artifactId>jogl-all-main</artifactId>
<version>2.0-rc11</version>
</dependency>
</dependencies>
Maven вытащит все зависимости при следующей попытке построить проект.
Подробнее читайте здесь в вики
Ответ 2
При работе с JNI и Maven Проекты с JNI - это ссылка, с которой следует начинать. Он охватывает гораздо больше, чем ваша текущая проблема (которая "просто" использует библиотеку, которая опирается на 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 с небольшим количеством win32 ящики.
К сожалению System.load()
не справляется с загрузка библиотек из банки, поэтому нам понадобится обычай загрузчик, который извлекает библиотеку в временный файл во время выполнения; это очевидно, достижимо.
Затем, как объясняется, идея заключается в использовании загрузчика пользовательской библиотеки для загрузки собственной библиотеки. Хорошей новостью является то, что такой погрузчик "предоставляется", как объяснено ниже.
загрузчик библиотеки
Теперь у нас есть библиотека JNI на путь класса, поэтому нам нужен способ загрузив его. Я создал отдельный проект, который будет извлекать JNI библиотеки из пути к классу, затем загрузите их. Найдите его на http://opensource.mxtelecom.com/maven/repo/com/wapmx/native/mx-native-loader/1.2/. Это добавляется как зависимость от pom, очевидно.
Чтобы использовать это, позвоните com.wapmx.nativeutils.jniloader.NativeLoader.loadLibrary(libname)
. Дополнительная информация содержится в javadoc для NativeLoader
.
Я вообще предпочитаю обертывать такие вещи в блоке try/catch следующим образом:
public class Sqrt {
static {
try {
NativeLoader.loadLibrary("sqrt");
} catch (Throwable e) {
e.printStackTrace();
System.exit(1);
}
}
/* ... class body ... */
}
Теперь мы должны быть в точке, где наши тесты junit работают от maven; mvn тест должен работать! Он также должен работать отлично от среды IDE.
Теперь, чтобы ответить на ваши вопросы, как:
Автоматически загружать, при необходимости, ZIP файл JOGL с ОС (содержит 4 файла jar и некоторые файлы с исходными файлами (.so/.dll)); или зависит от проекта Maven, который является оберткой одного из файлов.
К сожалению, банки JOGL 2.0 недоступны в репозитории Maven в java.net, поэтому вам придется иметь дело с этим и сделать их доступными в частном репозитории или установить их вручную в локальном хранилище каждого разработчика. Для этого используйте mvn install:install-file
, как описано в Руководство по установке сторонних JAR (а не mvn deploy:deploy-file
, как и вы, эта цель используется для установки артефактов в удаленный репозиторий).
Лично я бы загрузил ZIP файлы JOGL 2.0 из 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. См. этот ответ, например, для получения более подробной информации об этом.
Ответ 3
Для JOGL 2.0 здесь есть maven repo: http://jogamp.org/deployment/maven/
Я использую SBT для создания моих проектов. Редактор, который нужно добавить в build.sbt
:
resolvers += MavenRepository("jogamp", "http://jogamp.org/deployment/maven")
И зависимость, например, для базовой библиотеки jogl:
libraryDependencies += "org.jogamp.jogl" % "jogl-all" % "2.0-rc9"
В maven файлах maven это будет что-то вроде (согласно this):
<settings>
<profiles>
<profile>
<id>jogamp</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<repositories>
<repository>
<id>jogamp-remote</id>
<name>jogamp test mirror</name>
<url>http://www.jogamp.org/deployment/maven/</url>
<layout>default</layout>
</repository>
</repositories>
</profile>
</profiles>
</settings>
С зависимостью, объявленной как:
<dependency>
<groupId>org.jogamp.jogl</groupId>
<artifactId>jogl-all</artifactId>
<version>2.0-rc9</version>
</dependency>
Чтобы автоматически загрузить собственный собственный баннер, в sbt я делаю что-то вроде:
sys.props("os.name") match {
case "Linux" => "org.jogamp.jogl" % "jogl-all-natives-linux-i586" % "2.0-rc9"
... etc. ...
Ответ 4
Я не знаю библиотеку JOGL, но у меня есть опыт работы с Java3d, который имеет те же проблемы установки/сборки. Есть два способа добиться этого:
-
сообщите разработчикам об установке JOGL без помощи, а затем обработайте библиотеки JOGL как системные зависимости, как мы делаем с Java3d
<dependency>
<groupId>javax.java3d</groupId>
<artifactId>j3dcore</artifactId>
<version>1.5.1</version>
<scope>system</scope>
<systemPath>${java.home}/lib/ext/j3dcore.jar</systemPath>
</dependency>
-
поместите все банки и зависящие от системы библиотеки в собственный репозиторий и создайте для них подходящие им
Если вы сильно хотите автоматизировать установку Maven в JOGL, вы можете попробовать использовать maven-antrun-plugin или создать собственный плагин Maven, который обрабатывает установку (a хорошим примером является Cargo, который загружает серверы и распаковывает его).
Я использую первый вариант - скажите разработчикам установить JOGL. В нашем случае приложение Java3d распространяется Java WebStart, поэтому для них установка Java3d полностью автоматизирована WebStart.
Ответ 5
Здесь для справки является частью моего файла 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>
Ответ 6
этот script будет загружать выпуск с URL-адреса и устанавливать его в локальный (именуемый) репозиторий.
https://gist.github.com/1624599
пример использования: ./install_jogl_maven http://jogamp.org/deployment/v2.0-rc5 path_to_local_repo 2.0-rc5
Ответ 7
Нет простого способа добиться этого. Попробуйте, если вы можете сконфигурировать maven-assembly-plugin, чтобы создать исполняемую банку и упаковать правильные файлы с вашим кодом. Вы не можете использовать управление зависимостями maven для достижения этого, потому что вам нужно, чтобы содержимое ZIP не было самим ZIP. Вы можете попробовать maven- ant -plugin.