java - 我可以使用 Ant 检测我是否在 Linux 系统(而不是通用 Unix 系统)上吗?

标签 java ant

我有以下问题:在操作系统是 Linux 的情况下和在操作系统是 MacOs 的情况下,我必须执行不同的操作。

所以我创建了以下 Ant 脚本目标:

<condition property="unix">
    <os family="unix" />
</condition>

<condition property="mac">
    <os family="mac" />
</condition>

<target name="initUnixPath" if="unix" depends="clean">
    <echo message="initUnixPath: SETTING UNIX PATH" />
    <property name="path">/usr/share/XCloud/appl/lib/</property>
</target>

<target name="initMacPath" if="mac" depends="clean">
    <echo message="initMacPath: SETTING MAC PATH" />
    <property name="path">${basedir}/../../../Mac/CrystalIce/CrystalIce/CrystalIce/Build/Products/Debug/CrystalIce.app/Contents/Resources/java/</property>
</target>

    <!-- Copy SharedLib jar files: -->
    <!--<copy todir="${basedir}/../../../../../../../../usr/share/XCloud/appl/lib">-->
    <!--<copy todir="/usr/share/XCloud/appl/lib">-->
    <echo message="${path}" />
    <copy todir="${path}">
        <fileset dir="${basedir}/../../SharedLib" />
    </copy>
            ..................................................
            ..................................................
            COPY OTHER FILES

当它执行init目标时,该目标依赖于initUnixPathinitMacPat目标

因此发生了以下事情:

1) 如果我在 Linux 计算机上执行它,它首先执行将 path 属性设置为正确值的 initUnixPath:“/usr/share/XCloud/appl/lib/”,然后执行 initMacPath 并且不执行任何操作,因为 Linux 计算机不是 MacOs 计算机。因此,执行 init 目标并将文件复制到正确的位置:“/usr/share/XCloud/appl/lib/”

2)如果我在MacOs机器上执行它,它首先执行设置路径initUnixPath(因为MacOs是基于BSD的系统,所以它是UNIX机器) > 属性修改为WRONG值“/usr/share/XCloud/appl/lib/”(因为这是Linux系统的路径,而不是MacO的路径),然后执行initMacPath (因为它匹配)并尝试为 MacOs 系统设置正确的路径(“${basedir}/../../../../../../../../usr/share/XCloud/appl/lib") 但它无法执行此操作,因为该属性刚刚设置且无法更改!!!)

所以我遇到了问题,因为在 MacOs 计算机上,我的路径值设置为错误的 Linux 路径(“/usr/share/XCloud/appl/lib/”),而不是正确的 MacOs 路径(“$ {basedir}/../../../../../../../../usr/share/XCloud/appl/lib")

我找到的唯一解决方案是更改 init 目标中依赖项的顺序:

<target name="init" depends="initUnixPath, initMacPath ">

至:

<target name="init" depends="initMacPath, initUnixPath ">

所以是Mac为MacOs系统设置了正确的路径,然后在initUnixPath中输入尝试设置Linux路径但不行(并且在Mac上运行良好)

如果是 Linux 系统,请尝试执行 initMacPath,但 Linux 不是 Mac,因此退出此目标并执行 initUnixPath,其中正确设置了 Linux 路径(并且运行良好)在 Linux 上)

但这对我来说似乎是一个非常肮脏的解决方案!!!

所以我问我是否可以更准确地检测它是否是 LINUX 系统(而不是通用的 UNIX 系统)。我能做到吗?

Tnx

安德里亚

最佳答案

我总是将安装的二进制文件符号链接(symbolic link)到 /usr/local/bin 。这样我就不用担心是否安装在/Applications了或/opt/usr/share等。如果您在该位置没有看到可执行文件(通过 <available/> 任务),则使构建失败并提供有关执行操作的说明。

<property name="bin.link.dir"  value="/usr/local/bin"/>
<available file="${bin.link.dir}/xcloud" <!-- Or whatever the app -->
    property="xcloud.app.available"/>    <!-- Or whatever the app -->
<fail>
   Could not find required app...
   download it from yadda, yadda, yadda...
   Install it by blah, blah, blah...
   Then create a symbolic link to ${link.dir}...
   <condition>
      <not>
         <isset property="xcloud.app.available"/>
      </not>
   </condition>
</fail>

您还可以使用uname如果是Unix类型系统则命令查看是否是Linux:

<!-- outputs "Darwin" on Mac and "Linux" on Linux -->
<exec executable="uname"
   os="unix"
   outputproperty="os.type"/>

<condition property="linux.os">
    <equals  arg1="${os.type}"  arg2="Linux"/>
</condition>

关于java - 我可以使用 Ant 检测我是否在 Linux 系统(而不是通用 Unix 系统)上吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19500112/

相关文章:

javascript - 从 iframe HTML 传递 token 的解决方案

java - 级联持久化具有未知 PK/FK 属性的 JPA 实体违反 NotNullConstraint

java - 在 Eclipse 中添加 Ant 变量

java - 如何从 .jar 创建 .exe

eclipse - ant basedir 和 eclipse .project 文件生成

java - 使用 Java API 的增强现实应用程序

java - 异步发送邮件

Java 等待可运行完成

java - 如何让 Eclipse Ant 构建器使用 Eclipse 中内置的编译器?

java - taskdef 类org.apache.jasper.JspC 需要的类找不到: Could not initialize class org. apache.jasper.JspC