Maven和JOGL库?

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

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

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

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

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

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

Jogamp现在包含对Maven的支持,用于jogl组件(jocl和joal支持即将推出)。 从2.0-rc11开始,软件包被推送到Maven Central。

把它放到你的pom:

  org.jogamp.gluegen gluegen-rt-main 2.0-rc11   org.jogamp.jogl jogl-all-main 2.0-rc11   

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

在维基上阅读更多内容

在处理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) 。 更多信息在NativeLoader的javadoc中。

我通常喜欢将这些东西包装在try / catch块中,如下所示:

 public class Sqrt { static { try { NativeLoader.loadLibrary("sqrt"); } catch (Throwable e) { e.printStackTrace(); System.exit(1); } } /* ... class body ... */ } 

我们现在应该在我们的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工件的标准依赖关系,实际上,使用配置文件来获取特定于体系结构的依赖关系。 像这样的东西:

  ...   net.java.dev.jogl jogl 2.0-beta10  ...  ...   linux-i586   i386 unix linux     net.java.dev.jogl.jogl-linux-i586 jogl-linux-i586 2.0-beta10    ...  ...  

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

    opensource.mxtelecom.com http://opensource.mxtelecom.com/maven/repo  ...  ...   com.wapmx.native mx-native-loader 1.2  ...  ...  

关于你问题的第二部分:

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

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

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 xml文件中,这将是(根据此 ):

     jogamp  true    jogamp-remote jogamp test mirror http://www.jogamp.org/deployment/maven/ default      

依赖声明为:

  org.jogamp.jogl jogl-all 2.0-rc9  

为了自动下载适当的原生jar,在sbt中我做了类似的事情:

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

我不知道JOGL库,但我有Java3d的经验,它有相同的安装/构建问题。 有两种方法可以达到这个目的:

  • 告诉开发人员在没有辅助的情况下安装JOGL,然后像处理Java3d一样将JOGL库视为系统依赖

      javax.java3d j3dcore 1.5.1 system ${java.home}/lib/ext/j3dcore.jar  
  • 将所有jar和系统相关的库放在自己的存储库中,并为它们创建合适的poms

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

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

这里,作为参考,是我的Ant build.xml文件的一部分,下载和解压缩JOGL库(2.0 beta 10)。

                                         Detected operating system: ${joglostype} (if invalid OS, update ant build file)                

此脚本将从URL下载发行版并将其安装到本地(命名)存储库。 https://gist.github.com/1624599

示例用法: ./install_jogl_maven http://jogamp.org/deployment/v2.0-rc5 path_to_local_repo 2.0-rc5

没有简单的方法可以实现这一目标。 尝试配置maven-assembly-plugin以构建可执行jar并使用您的代码打包正确的文件。 您不能使用maven依赖关系管理来实现此目的,因为您需要ZIP内容而不是ZIP本身。 你可以试试maven-ant-plugin 。