Maven и библиотека JOGL? - PullRequest
       39

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

28 голосов
/ 26 декабря 2009

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

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

Ответы [ 7 ]

25 голосов
/ 28 декабря 2009

При работе с 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 в банка с файлами классов.

Это означает либо кросс-компиляцию для все возможные архитектуры или более просто имея другую баночку для каждая архитектура. Этот последний подходит довольно хорошо с нашей настройкой - где почти все наши машины Linux-i386, с небольшим количеством win32 коробки.

К сожалению 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 {
    static {
        try {
            NativeLoader.loadLibrary("sqrt");
        } catch (Throwable e) {
            e.printStackTrace();
            System.exit(1);
        }
    }
    /* ... class body ... */
}

Теперь мы должны быть в точке, где наши тесты Junit работают от Maven; мвн тест должен работать! Должно также работать штраф из IDE.

Теперь, чтобы ответить на ваши вопросы, как:

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

К сожалению, jog-файлы JOGL 2.0 недоступны в репозитории Maven java.net, поэтому вам придется с этим справиться и либо сделать их доступными в частном репозитории, либо установить их вручную в локальном репозитории каждого разработчика. Для этого используйте mvn install:install-file, как описано в Руководстве по установке сторонних JAR (а не mvn deploy:deploy-file, как вы это делали, эта цель используется для установки артефактов в удаленный репозиторий).

Лично я бы скачал ZIP-файлы JOGL 2.0 с предоставленного вами URL-адреса , упаковал его, как они делали с JOGL 1.1.1 (один JAR-файл Java и несколько специальных JAR-файлов для собственных библиотек), и установил JAR-файлы каждый локальный репозиторий на данный момент. Затем объявите стандартную зависимость от артефакта Java и, на самом деле, используйте profile для зависимости от конкретной архитектуры. Примерно так:

<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-файлов, и вам не нужно будет распаковывать их ни во время разработки, ни для распространения вашего проекта. Для распространения вам просто нужно создать jar, включающий зависимости. Это можно сделать с помощью плагина maven-assembly-plugin. См. этот ответ , например, для более подробной информации об этом.

15 голосов
/ 24 ноября 2012

Jogamp теперь содержит поддержку Maven для компонентов jogl (ожидается поддержка jocl и joal). Начиная с 2.0-rc11, пакеты отправляются в Maven Central.

Просто положи это к себе:

 <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 извлечет все зависимости при следующей попытке построить проект.

Подробнее здесь на вики

6 голосов
/ 03 июля 2012

Здесь есть репозиторий Maven для JOGL 2.0: 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 xml это будет что-то вроде (согласно 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>

Чтобы автоматически загрузить правильный нативный jar, в sbt я делаю что-то вроде:

sys.props("os.name") match {
  case "Linux" => "org.jogamp.jogl" % "jogl-all-natives-linux-i586" % "2.0-rc9"
  ... etc. ...
5 голосов
/ 28 декабря 2009

Я не знаю библиотеку 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>
    
  • поместите все jar-файлы и системные библиотеки в собственный репозиторий и создайте для них подходящие poms

Если вы сильно хотите автоматизировать установку JOGL в Maven, вы можете попробовать использовать maven-antrun-plugin или создать собственный плагин Maven, который обрабатывает установку (хорошим примером является Cargo , который скачивает серверы и распаковывает их).

Считаю целесообразным использовать первый вариант - указать разработчикам установить JOGL. В нашем случае приложение Java3d распространяется Java WebStart, поэтому для них установка Java3d полностью автоматизирована WebStart.

2 голосов
/ 23 февраля 2010

Здесь для справки приведена часть моего файла 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>
1 голос
/ 17 января 2012

этот скрипт загрузит релиз с URL и установит его в локальное (именованное) хранилище. https://gist.github.com/1624599

пример использования: ./install_jogl_maven http://jogamp.org/deployment/v2.0-rc5 path_to_local_repo 2.0-rc5

0 голосов
/ 27 декабря 2009

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

...