Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Maven和JOGL图书馆?_Java_Maven_Maven 2_Build Process_Jogl - Fatal编程技术网

Java 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文件中(这会使它们能够自动使用,还是我需要更复杂的东西?) 我认为我的问题的一部分是我不

在过去几天的空闲时间里,我一直在学习Maven,但似乎不知道如何组织一个项目,以便使用JOGL库。我希望有以下几点:

  • 如有必要,从(包含4个jar文件和一些本机库文件(.so/.dll)),自动下载特定于操作系统的JOGL zip文件;或者依赖于Maven项目,该项目是其中一个文件的包装器
  • 适当地解压缩该zip文件,以便:
  • jar文件被添加到类路径中,并根据需要进行部署,以及
  • 本机库文件被添加到最终的jar文件中(这会使它们能够自动使用,还是我需要更复杂的东西?)
  • 我认为我的问题的一部分是我不完全理解JOGL的用法,在运行代码时本地库应该放在哪里,等等。我需要回到基础,编写一个JOGL hello world,从命令行编译它,并从命令行运行它,以查看本机库的目录位置所需的内容;事实上,我可能现在就去做

    对于第1项,我发现了一些操作系统特有的特性;Maven配置文件可以根据系统的属性(包括操作系统)激活。因此,我可以激活一个Windows配置文件,它依赖于Windows特定的JOGL库,同样适用于Linux,并且都有一个64位的alterego。(激活/)

    我曾尝试基于JOGL-jar文件创建一个Maven存储库,然后添加JOGL-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 盒子

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

      然后,如前所述,我们的想法是使用自定义库加载器来加载本机库。好消息是“提供”了这样一个加载程序,如下所述

      库加载器 现在,我们的JNI库位于 类路径,所以我们需要一种 加载它。我创建了一个单独的 将提取JNI的项目 从类路径创建库,然后 加载它们。在找到它 . 这将作为依赖项添加到 很明显,是波姆

      要使用它,请致电
      com.wapmx.nativeutils.jniloader.NativeLoader.loadLibrary(libname)
      。 更多信息请参见
      NativeLoader

      我通常喜欢把这些东西包起来 在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项目,该项目是其中一个文件的包装器

      遗憾的是,JOGL 2.0 JAR在java.net的Maven存储库中不可用,因此您必须解决这个问题,要么在私有存储库中提供它们,要么在每个开发人员的本地存储库中手动安装它们。为此,请使用中记录的
      mvn install:install file
      (而不是
      mvn deploy:deploy file
      ,此目标用于将构件安装到远程存储库)

      就我个人而言,我会从你提供的JOGL 2.0 Zip下载,并按照他们的方式打包
      <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>