【问题标题】:how to build a jar with maven for a specific OS?如何使用 maven 为特定操作系统构建 jar?
【发布时间】:2017-03-24 23:19:04
【问题描述】:

我正在使用 Eclipse 的 Maven 构建一个将在远程服务器上运行的 jar。我的系统运行 OS X,服务器运行 CestOS。 对于这个项目,我需要tensorflow library。 Maven 成功解决了依赖关系,因此我能够在本地运行该项目。但是,在服务器上我收到错误,即 tensorflow 库不存在,因为默认情况下 maven 仅包含 macosx 版本。如何在构建期间强制 maven 用 linux 版本替换 tensorflow 的 macosx 版本?

不同平台的TensorFlow java库可以找到here

附:我已经尝试在 pom 中添加一个依赖项,系统范围指向 jar。

【问题讨论】:

  • 您是否尝试过考虑 Maven 配置文件?
  • 是的,我尝试使用配置文件,但我只能找到有关如何根据当前操作系统激活特定配置文件的信息。我找不到如何创建将为不同操作系统构建 jar 的配置文件。
  • 您能对错误进行快照吗?或者您可以在此处包含错误日志吗?
  • java.lang.UnsatisfiedLinkError: java.lang.ClassLoader.loadLibrary(ClassLoader.java:1886) 处 java.lang.Runtime.loadLibrary0(Runtime.java: 849) 在 java.lang.System.loadLibrary(System.java:1088) 在 org.bytedeco.javacpp.Loader.loadLibrary(Loader.java:654) 在 org.bytedeco.javacpp.Loader.load(Loader.java:492 ) 在 org.bytedeco.javacpp.Loader.load(Loader.java:409) 在 org.bytedeco.javacpp.tensorflow.(tensorflow.java:10) 在 java.lang.Class.forName0(Native Method) 。 ..
  • 您有没有机会尝试这里提出的解决方案?

标签: java eclipse maven tensorflow bytecode


【解决方案1】:

在你的 POM 中试试这个:

<dependency>
    <groupId>org.bytedeco.javacpp-presets</groupId>
    <artifactId>tensorflow</artifactId>
    <version>0.9.0-1.2</version>
</dependency>
<dependency>
    <groupId>org.bytedeco.javacpp-presets</groupId>
    <artifactId>tensorflow</artifactId>
    <version>0.9.0-1.2</version>
    <classifier>linux-x86_64</classifier>
</dependency>

或者linux-x86,如果您的服务器是 32 位的。

当然,使用配置文件定义条件依赖会很好。

【讨论】:

    【解决方案2】:

    从你链接的页面上的jar名称来看,MacOs和Linux版本的区别在于jar名称version后面的文字。

    这称为classifier(参见Maven coordinates),是一个可选坐标,在工件版本之后提供了额外的区别。

    正如nandsito 已经建议的那样,为了扩展它的答案,试试这个(未经测试,让我知道,我会更新):

    <profiles>
        <profile>
            <id>osx</id>
             
            <dependencies>
                <dependency>
                    <groupId>org.bytedeco.javacpp-presets</groupId>
                    <artifactId>tensorflow</artifactId>
                    <version>0.9.0-1.2</version>
                    <classifier>macosx-x86_64</classifier>
                </dependency>
            </dependencies>
            
        </profile>
        
        <profile>
            <id>linux</id>
            
            <dependencies>
                <dependency>
                    <groupId>org.bytedeco.javacpp-presets</groupId>
                    <artifactId>tensorflow</artifactId>
                    <version>0.9.0-1.2</version>
                    <classifier>linux-x86_64</classifier>
                </dependency>
            </dependencies>
    
        </profile>
    
    </profiles>
    

    并删除您 POM 中其他所有相关的 &lt;dependency&gt; 节点(这样,如果没有 &lt;profiles&gt; 部分,tensorflow 就不会存在依赖关系)。

    在此更改之后,您每次都必须指定一个配置文件(因为 POM 中没有 tensorflow 依赖项):在 MacOs 上准备包时mvn clean package -Pmacos 和在 Centos 上准备包时mvn clean package -Plinux

    Eclipse 允许您在Project properties > Maven 下设置活动配置文件列表(您可以通过右键单击Project explorer 中的项目文件夹进入此窗口。

    【讨论】:

      【解决方案3】:

      我认为您必须设置一个构建系统,例如 Jenkins,并为每个目标环境/平台进行配置。 Linux编译时,配置编译系统运行这个命令mvn clean package -Djavacpp.platform=linux-x86_64,这里的重点是参数-Djavacpp.platform,根据你的目标平台改一下。

      【讨论】:

        猜你喜欢
        • 2014-10-16
        • 1970-01-01
        • 2022-01-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-21
        • 1970-01-01
        相关资源
        最近更新 更多