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

时间:2011-11-11 15:17:20

标签: ant tomcat

我有一个脚本可以使用 Catalina.bat 来检测操作系统,而 Catalina.sh 用于UNIX ..它可以成功执行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 文件中未达到操作系统版本声明,因此我猜这个解决方案; 使用我的Ant脚本本身显式设置CATALINA_HOME环境变量;怎么做plz建议任何解决方案。

我正在使用这段代码,这里OS.version属性应该从catalina.bat文件中缓存操作系统版本类似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>

问题已解决:你是对的..

<exec executable="cmd" outputproperty="tomcat.version">
      <arg value="/c"/>
      <arg value="${MY_PROJ}\tomcat\bin\version.bat"/>
      <env key="CATALINA_HOME" value="${MY_PROJ}\tomcat\"/>

        <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}"/>

输出:

versioncat:
     [echo] tomcat.version: 6.0.33

最后不能给任何人回答或建议我最后一次评论的问题愚蠢的问题

3 个答案:

答案 0 :(得分:2)

如果我理解正确,您正在从Ant执行此操作系统检测。在这种情况下,您是否可以使用Ant的内置支持来识别操作系统 - 在os condition

但是,如果您确实需要在设置CATALINA_HOME时执行catalina.bat,则可以使用exec task中的嵌套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.bat的内容:

echo CATALINA_HOME=%CATALINA_HOME%

这是输出:

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

关于tomcat版本的后续问题(在评论中)......

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

Ant和Java不了解您的Tomcat环境,所以现在您回到执行%CATALINA_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>

这是输出:

version:
     [echo] tomcat.version: 5.5.33

请注意,此示例假定您在终端中设置了CATALINA_HOME(和JAVA_HOME)环境变量。

或者,您可以使用嵌套的<env>元素传递这些变量,如前所述。但似乎这些应该来自运行时环境,而不是嵌入在构建文件中。

答案 1 :(得分:0)

这样做:

<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>

答案 2 :(得分:0)

根据您的具体情况,您可能会发现这种方法更加平台无关,并且不易出错,因为您不需要分离shell。这至少可以追溯到Tomcat 6.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}"/>