Maven和JOGL库?

Ric*_*ket 28 java build-process maven-2 jogl maven

我在过去几天的空闲时间里一直在研究Maven,但似乎无法弄清楚如何组织项目以便使用JOGL库.我最好喜欢以下内容:

  1. 如有必要,从此处自动下载特定于操作系统的JOGL zip文件(包含4个jar文件和一些本机库文件(.so/.dll)); 或依赖于Maven项目,该项目是其中一个文件的包装.
  2. 适当地解压缩该zip文件,以便:
    1. jar文件被添加到类路径中并根据需要进行部署
    2. 本机库文件被添加到最终的jar文件中(这会使它们自动使用,还是需要更多参与?)

我认为我的问题的一部分是我不完全理解JOGL的使用,在运行代码时放置本机库的位置等等.我需要回到基础并编写一个JOGL hello世界,从中编译它命令行并从命令行运行它,以确切了解它对本机库的目录放置所需的内容; 实际上,我现在可能会这样做.

在第1项中,我发现了一些特定于操作系统的功能; 可以基于系统的属性(包括操作系统)激活Maven配置文件.那么我就可以激活一个Windows配置文件,该配置文件具有Windows特定的JOGL库的依赖性,对于Linux也是如此,并且都具有64位的改变自我.(激活官方文档/非官方文档.)

我尝试创建一个基于JOGL jar文件的Maven存储库,然后添加JOGL jar文件项目作为我项目的依赖项; 依赖项已下载,但未使用.我不知道jar文件在哪里或如何使用它,解压缩等等.这是我使用的命令.

简而言之:JOGL由四个.jar文件和一些本机库组成.如何将这些文件集成到我的Maven项目中,以便我可以使用Maven编写JOGL应用程序来处理我的构建过程?此外,我如何根据操作系统使用不同的文件集,因为Windows,Linux和Mac之间的本机库甚至.jar文件当然不同.

Pas*_*ent 25

在处理JNI和Maven时,使用JNI的项目应该是应该开始的参考.它涵盖的内容远远超过您当前的问题("只是"使用依赖于JNI和本机库的库),但是,能够做得更多的人可以做得更少.

如果仔细阅读,您会发现使用JNI库的一个解决方案是将它们捆绑在特定于体系结构的JAR中,以便您可以像Maven一样依赖它们,就像任何其他依赖项一样.这实际上是http://download.java.net/maven/2/net/java/dev/jogl/中打包JOGL版本1.1.1的方式 ,有一个带有Java类的JAR工件和几个特定于体系结构的JAR工件与本机库.

JNI库存档在jar中

我最终使用的解决方案是将已编译的jni库与类文件一起存储在jar中.

这意味着要么为所有可能的架构进行交叉编译,要么更简单地说,为每个架构设置不同的jar.后者非常适合我们的设置 - 几乎所有的机器都是Linux-i386,只有少量的win32盒子.

遗憾的是System.load()无法处理从jar中加载库,因此我们需要一个自定义加载器,它在运行时将库提取到临时文件中; 然而,这显然是可以实现的.

然后,如上所述,我们的想法是使用自定义库加载器来加载本机库.好消息是这样的装载机是"提供"的,如下所述.

库加载器

我们现在在类路径上有我们的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 ... */
}
Run Code Online (Sandbox Code Playgroud)

我们现在应该在我们的junit测试从maven工作的时候; 一个mvn测试应该工作!它也可以在IDE中正常工作.

现在,回答你的问题,如何:

如有必要,从此处自动下载特定于操作系统的JOGL zip文件(包含4个jar文件和一些本机库文件(.so/.dll)); 或依赖于Maven项目,该项目是其中一个文件的包装.

遗憾的是,JO.NET 2.0 jar在java.net的Maven存储库中不可用,因此您必须处理它并使它们在私有存储库中可用,或者在每个开发人员的本地存储库中手动安装它们.为此,请mvn install:install-file按照" 指南"中的说明使用以安装第三方JAR(而不是mvn deploy:deploy-file像您一样,此目标用于将工件安装到远程存储库).

就个人而言,我会从您提供的URL下载JOGL 2.0 ZIP,将其打包为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>
Run Code Online (Sandbox Code Playgroud)

不要忘记添加自定义库加载器和依赖项所需的存储库:

<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>
Run Code Online (Sandbox Code Playgroud)

关于你问题的第二部分:

适当地解压缩该zip文件,以便(...)

正如我所解释的那样,您实际上不会依赖ZIP文件而是依赖于JAR,您无需在开发期间解压缩它们,也不需要分发项目.对于分发,您只需要创建一个包含依赖项的jar.这可以使用maven-assembly-plugin完成.有关详细信息,请参阅此答案.


Mar*_*ler 15

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>
Run Code Online (Sandbox Code Playgroud)

Maven将在您下次尝试构建项目时提取所有依赖项.

在维基上阅读更多内容


axe*_*l22 6

JOGL 2.0有一个maven repo:http://jogamp.org/deployment/maven/

我使用SBT来构建我的项目.您需要添加的解析器build.sbt:

resolvers += MavenRepository("jogamp", "http://jogamp.org/deployment/maven")
Run Code Online (Sandbox Code Playgroud)

和依赖,例如,基础jogl库:

libraryDependencies += "org.jogamp.jogl" % "jogl-all" % "2.0-rc9"
Run Code Online (Sandbox Code Playgroud)

在maven xml文件中,这可能是(根据这个):

 <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>
Run Code Online (Sandbox Code Playgroud)

依赖声明为:

<dependency>
  <groupId>org.jogamp.jogl</groupId>
  <artifactId>jogl-all</artifactId>
  <version>2.0-rc9</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

要自动下载适当的本机jar,在sbt我做的事情如下:

sys.props("os.name") match {
  case "Linux" => "org.jogamp.jogl" % "jogl-all-natives-linux-i586" % "2.0-rc9"
  ... etc. ...
Run Code Online (Sandbox Code Playgroud)


cet*_*nar 5

我不知道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>
    
    Run Code Online (Sandbox Code Playgroud)
  • 将所有jar和系统相关的库放在自己的存储库中,并为它们创建合适的poms

如果您非常希望使用Maven安装JOGL进行自动化,您可以尝试使用maven-antrun-plugin或创建自己的Maven插件来处理安装(一个很好的例子是Cargo下载服务器并解压缩它).

我考虑使用第一个选项 - 告诉开发人员安装JOGL.在我们的例子中,Java3d应用程序由Java WebStart分发,因此对于它们来说,Web3art完全自动化了Java3d的安装.