Java Maven和JOGL图书馆?
在过去几天的空闲时间里,我一直在学习Maven,但似乎不知道如何组织一个项目,以便使用JOGL库。我希望有以下几点:Java Maven和JOGL图书馆?,java,maven,maven-2,build-process,jogl,Java,Maven,Maven 2,Build Process,Jogl,在过去几天的空闲时间里,我一直在学习Maven,但似乎不知道如何组织一个项目,以便使用JOGL库。我希望有以下几点: 如有必要,从(包含4个jar文件和一些本机库文件(.so/.dll)),自动下载特定于操作系统的JOGL zip文件;或者依赖于Maven项目,该项目是其中一个文件的包装器 适当地解压缩该zip文件,以便: jar文件被添加到类路径中,并根据需要进行部署,以及 本机库文件被添加到最终的jar文件中(这会使它们能够自动使用,还是我需要更复杂的东西?) 我认为我的问题的一部分是我不
简而言之:JOGL由四个.jar文件和一些本机库组成。我如何将这些文件集成到Maven项目中,以便编写一个由Maven处理构建过程的JOGL应用程序?此外,我如何根据操作系统使用不同的文件集,因为本机库甚至.jar文件在不同的Windows中都不同,Linux和Mac。要实现这一点,没有简单的方法。如果可以将配置为构建可执行jar并用代码打包正确的文件,请尝试。您不能使用maven依赖项管理来实现这一点,因为您需要的是ZIP内容,而不是ZIP本身。您可以试试。我不知道JOGL库,但我有使用Java3d的经验,它有相同的安装/构建问题。有两种方法可以实现这一点:
- 告诉开发人员在无人协助的情况下安装JOGL,然后像对待Java3d一样,将JOGL库视为系统依赖项
<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>
javax.java3d 或者创建自己的Maven插件来处理安装(一个很好的例子是下载服务器并解包)
我考虑使用第一个选项告诉开发者安装JOGL。在我们的例子中,Java3d应用程序是由Java WebStart分发的,因此对于他们来说,Java3d的安装是由WebStart完全自动化的。
在处理JNI和Maven时,是一开始就应该参考的。它涵盖的内容远不止您当前的问题(即“仅仅”使用依赖于JNI和本机库的库),但是,能够做得更多的人可以做得更少 如果仔细阅读,您会发现使用JNI库的一个解决方案是将它们绑定到特定于体系结构的JAR中,这样您就可以像从Maven的角度看任何其他依赖一样依赖它们。这实际上就是JOGL版本1.1.1的打包方式,有一个JAR工件和Java类,还有几个特定于体系结构的JAR工件和本机库 JNI库归档在jar中 我最终使用的解决方案是 将编译后的jni库存储在 类文件旁边的jar 这意味着交叉编译 所有可能的体系结构,或更多 简单地说,有一个不同的罐子 每种架构。后者合适 我们的设置很好-在哪里 几乎我们所有的机器都是 Linux-i386,带有少量win32 盒子 遗憾的是,
无法处理 从jar中加载库, 因此,我们需要一个定制 加载程序,它将库提取到 运行时的临时文件;这是 然而,这显然是可以实现的 然后,如前所述,我们的想法是使用自定义库加载器来加载本机库。好消息是“提供”了这样一个加载程序,如下所述 库加载器 现在,我们的JNI库位于 类路径,所以我们需要一种 加载它。我创建了一个单独的 将提取JNI的项目 从类路径创建库,然后 加载它们。在找到它 . 这将作为依赖项添加到 很明显,是波姆 要使用它,请致电System.load()
。 更多信息请参见com.wapmx.nativeutils.jniloader.NativeLoader.loadLibrary(libname)
我通常喜欢把这些东西包起来 在try/catch块中,如下所示:NativeLoader
我们现在应该到了 我们的junit测试从maven开始工作;mvn 测试应该有效!它也应该起作用 从IDE上看很好 现在,回答您的问题,如何: 如果需要,从这里自动下载特定于操作系统的JOGL zip文件(包含4个jar文件和一些本机库文件(.so/.dll));或者依赖于Maven项目,该项目是其中一个文件的包装器 遗憾的是,JOGL 2.0 JAR在java.net的Maven存储库中不可用,因此您必须解决这个问题,要么在私有存储库中提供它们,要么在每个开发人员的本地存储库中手动安装它们。为此,请使用中记录的public class Sqrt { static { try { NativeLoader.loadLibrary("sqrt"); } catch (Throwable e) { e.printStackTrace(); System.exit(1); } } /* ... class body ... */ }
(而不是mvn install:install file
,此目标用于将构件安装到远程存储库) 就我个人而言,我会从你提供的JOGL 2.0 Zip下载,并按照他们的方式打包mvn deploy:deploy file
<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>
<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>
resolvers += MavenRepository("jogamp", "http://jogamp.org/deployment/maven")
libraryDependencies += "org.jogamp.jogl" % "jogl-all" % "2.0-rc9"
<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>
sys.props("os.name") match { case "Linux" => "org.jogamp.jogl" % "jogl-all-natives-linux-i586" % "2.0-rc9" ... etc. ...
<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>