如何检测安装的tomcat版本并使用Ant Apache脚本设置CATALINA_HOME env变量?

如何检测安装的tomcat版本并使用Ant Apache脚本设置CATALINA_HOME env变量?,ant,tomcat,Ant,Tomcat,我有一个脚本,用于检测操作系统,该脚本在windows中使用Catalina.bat,在UNIX中使用Catalina.sh。它在UNIX中成功执行,但在windows中无法从Catalina.bat提取操作系统版本。我发现的原因是,在Catalina.bat中,当它执行这一行时 if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome echo The CATALINA_HOME environment variable is not de

我有一个脚本,用于检测操作系统,该脚本在windows中使用Catalina.bat,在UNIX中使用Catalina.sh。它在UNIX中成功执行,但在windows中无法从Catalina.bat提取操作系统版本。我发现的原因是,在Catalina.bat中,当它执行这一行时

if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
echo The CATALINA_HOME environment variable is not defined correctly
echo This environment variable is needed to run this program
goto end
:okHome
然后在catalina.bat文件中没有到达OS版本语句,所以我想解决这个问题的方法是使用我的Ant脚本本身显式设置CATALINA_HOME环境变量;如何做到这一点,请提供解决方案。

我正在使用这段代码,这里OS.version属性应该缓存catalina.bat文件中的OS版本类似的代码在UNIX中工作正常,但我想知道出了什么问题

<property name="version" location="${My_proj}\tomcat\bin\catalina.bat"/>
<exec executable="${version}" outputproperty="OS.version">
        <arg value="version" />
          <redirector>
            <outputfilterchain>
               <tokenfilter>
                <containsstring contains="OS Name:"/>
                 <replacestring from="OS Name:        " to=""/> 
                </tokenfilter>
            </outputfilterchain>
         </redirector>


  </exec>

最后一个BUL任何人都不能回答或建议我的最后一个评论查询的解决方法这个愚蠢的问题

如果我理解正确,您正在从Ant执行此操作系统检测。在这种情况下,你能不能改用Ant的内置操作系统识别支持

但是,如果在设置catalina_HOME时确实需要执行catalina.bat,可以使用嵌套的
env
元素来执行

下面是一个使用两种方法的样例生成文件:

<project default="test">

  <target name="test">

    <!-- Execute a command, in this case a simple bat file
         which echoes the value of the var set in the env block 
    -->
    <exec executable="cmd">
      <arg value="/c"/>
      <arg value="test.bat"/>
      <env key="CATALINA_HOME" value="whatever"/>
    </exec>

    <!-- echo the values of built-in OS related properties -->
    <echo message="os.arch: ${os.arch}"/>
    <echo message="os.name: ${os.name}"/>
    <echo message="os.version: ${os.version}"/>

    <!-- test one of the os conditions -->
    <condition property="is.windows">
      <os family="windows"/>
    </condition>
    <echo message="is.windows ? ${is.windows}"/>

  </target>

</project>
以下是输出:

test:
     [exec]
     [exec] C:\tmp\ant>echo CATALINA_HOME=whatever
     [exec] CATALINA_HOME=whatever
     [echo] os.arch: x86
     [echo] os.name: Windows XP
     [echo] os.version: 6.1 build 7601 Service Pack 1
     [echo] is.windows ? true
version:
     [echo] tomcat.version: 5.5.33
关于您随后关于tomcat版本的问题(在评论中)

我现在猜您正在运行时环境中通过Ant执行此版本检测

Ant和Java不知道您的Tomcat环境,所以现在您可以重新执行
%CATALINA\u HOME%\bin\CATALINA.bat-version
并解析您需要的输出

下面是一个工作示例:

<project default="version">
  <property environment="env"/>

  <condition property="script.ext" value="bat">
    <os family="windows"/>
  </condition>
  <condition property="script.ext" value="sh">
    <os family="unix"/>
  </condition>

  <target name="version">
    <exec executable="${env.CATALINA_HOME}/bin/version.${script.ext}" outputproperty="tomcat.version">
      <redirector>
        <outputfilterchain>
          <tokenfilter>
            <containsstring contains="Server version"/> 
            <replaceregex pattern="Server version: Apache Tomcat/(.*)$" replace="\1"/>
          </tokenfilter>
        </outputfilterchain>
      </redirector>
    </exec>
    <echo message="tomcat.version: ${tomcat.version}"/>
  </target>
</project>
注意,本例假设您在终端中设置了CATALINA_HOME(和JAVA_HOME)环境变量

或者,您可以使用前面讨论过的嵌套
元素传递这些变量。但是,它们似乎更可能来自运行时环境,而不是嵌入到构建文件中。

这样做:

<condition property="catalina.path" value="C:\Foo\catalina.bat">
   <os family="windows"/>
</condition>
<condition property="catalina.path" value="/home/foo/catalina.sh">
   <os family="unix"/>
</condition>

<exec> ... execute your script here </exec>

... 在这里执行脚本

根据您的情况,您可能会发现这种方法与平台无关,并且不太容易出错,因为您不需要使用shell。这至少可以追溯到Tomcat6.x

<property environment="env"/>
<loadproperties>
  <zipentry zipfile="${env.CATALINA_HOME}/bin/bootstrap.jar" name="META-INF/MANIFEST.MF"/>
  <filterchain>
    <prefixlines prefix="tomcat."/>
  </filterchain>
</loadproperties>

<!-- Prints MAJOR.MINOR version, e.g.: 8.0 -->
<echo message="Tomcat Version: ${tomcat.Specification-Version}"/>

<!-- Prints full version, e.g.: 8.0.26 -->
<echo message="Tomcat Release: ${tomcat.Implementation-Version}"/>


我想知道投票失败的原因是什么?对于一个新用户来说,在没有提供建设性反馈的情况下否决投票是有点令人沮丧的。我认为你试图从catalina.bat的输出中提取操作系统版本,这太复杂了。我想你可以使用内置的Ant属性和条件得到你需要的东西。实际上我的代码从catalina.bat中提取OS版本和tomcat版本。这是我在catalina.bat中搜索的。正如你说的,tomcat是运行时配置。所以蚂蚁无法直接使用属性检测到。我的主要原因是没有将CATALINA_设置为HOME,而是查找tomcat版本。为问题道歉。。我认为将catalina_设置为home可以解决这个问题。如果有任何其他方法可以找到tomcat版本,则无需讨论这些复杂性。这三个点在这里意味着什么
Windows和UNIXI中的此set系统环境变量是否要捕获操作系统的版本,操作系统条件只是告诉其Windows问题:无法创建任务或键入环境原因:名称未定义。措施:检查拼写。操作:检查是否已声明任何自定义任务/类型。措施:检查是否发生了任何/声明。我有这个错误。。。它只是您实际应用于exec任务的任何属性的占位符。
@user1037728不知道您在那里做什么。
version:
     [echo] tomcat.version: 5.5.33
<condition property="catalina.path" value="C:\Foo\catalina.bat">
   <os family="windows"/>
</condition>
<condition property="catalina.path" value="/home/foo/catalina.sh">
   <os family="unix"/>
</condition>

<exec> ... execute your script here </exec>
<property environment="env"/>
<loadproperties>
  <zipentry zipfile="${env.CATALINA_HOME}/bin/bootstrap.jar" name="META-INF/MANIFEST.MF"/>
  <filterchain>
    <prefixlines prefix="tomcat."/>
  </filterchain>
</loadproperties>

<!-- Prints MAJOR.MINOR version, e.g.: 8.0 -->
<echo message="Tomcat Version: ${tomcat.Specification-Version}"/>

<!-- Prints full version, e.g.: 8.0.26 -->
<echo message="Tomcat Release: ${tomcat.Implementation-Version}"/>