Ric*_*ket 28 java build-process maven-2 jogl maven
我在过去几天的空闲时间里一直在研究Maven,但似乎无法弄清楚如何组织项目以便使用JOGL库.我最好喜欢以下内容:
我认为我的问题的一部分是我不完全理解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块中包装这些东西,如下所示:
Run Code Online (Sandbox Code Playgroud)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工件的标准依赖关系,实际上,使用配置文件作为特定于体系结构的依赖关系.像这样的东西:
<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将在您下次尝试构建项目时提取所有依赖项.
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)
我不知道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的安装.
| 归档时间: |
|
| 查看次数: |
13145 次 |
| 最近记录: |