Maven и библиотека JOGL?

Я изучал Maven в свободное время в течение несколько дней, но не могу понять, как организовать проект так, чтобы использовались библиотеки JOGL. Я бы предпочел следующее:

  1. Автоматически загружать, если необходимо, zip-файл JOGL для конкретной ОС из здесь (содержит 4 файла jar и несколько файлов собственной библиотеки (.so / .dll)); или зависеть от проекта Maven, который является оболочкой одного из файлов.
  2. Разархивируйте этот zip-файл соответствующим образом, чтобы:
    1. файлы jar добавлялись в путь к классам и развертывались по мере необходимости, а
    2. файлы собственной библиотеки добавлялись в final jar файл (позволит ли это использовать их автоматически, или мне понадобится что-то более сложное?)

Я думаю, что отчасти моя проблема в том, что я не совсем понимаю использование JOGL, где разместить собственные библиотеки при запуске кода и т. д. Мне нужно вернуться к основам и написать приветственный мир JOGL, скомпилировать его из командной строки и запустить из командной строки, чтобы точно увидеть, что ему требуется, в том, что касается размещения в каталоге собственных библиотек ; На самом деле, я могу пойти и сделать это прямо сейчас.

С помощью пункта 1 я обнаружил некоторые особенности ОС; Профили Maven можно активировать на основе свойств системы, в которую входит операционная система. Итак, я мог активировать профиль Windows, который зависит от специфической для Windows библиотеки JOGL, такой же для Linux, и у обоих есть 64-битное альтер-эго. (Активация официальная документация / неофициальная документация .)

Я попытался создать репозиторий Maven на основе файла JOGL jar, а затем добавить проект файла JOGL jar как зависимость от мой проект; зависимость загружается, но не используется. Я понятия не имею, где находится jar-файл, как его использовать, распаковывать и т. Д. Вот команда, которую я использовал.

Итак, вкратце: JOGL состоит из четырех файлов .jar и некоторых собственных библиотек.Как мне интегрировать эти файлы в мой проект Maven, чтобы я мог написать приложение JOGL с Maven, обрабатывающим мой процесс сборки? Кроме того, как я могу использовать другой набор файлов в зависимости от операционной системы, потому что, конечно, родная библиотеки и даже файлы .jar различаются в Windows, Linux и Mac.

28
задан Martin Seeler 26 November 2013 в 14:25
поделиться

4 ответа

При работе с 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. Смотрите, например, этот ответ .

.
25
ответ дан 28 November 2019 в 03:08
поделиться

Я не знаю библиотеку 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.

.
5
ответ дан 28 November 2019 в 03:08
поделиться

Нет простого способа сделать это. Попробуйте настроить maven-assembly-plugin на сборку исполняемой банки и упаковать нужные файлы с вашим кодом. Вы не можете использовать управление зависимостями maven для достижения этой цели, потому что вам нужно содержимое ZIP, а не сам ZIP. Вы можете попробовать maven-ant-plugin.

.
0
ответ дан 28 November 2019 в 03:08
поделиться

Здесь, для справки, находится часть моего файла 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>
2
ответ дан 28 November 2019 в 03:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: