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

3
我有一个脚本,使用Catalina.bat检测操作系统,适用于Windows和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 文件中未达到 OS 版本声明,因此我猜解决方法是:使用我的 Ant 脚本显式设置 CATALINA_HOME 环境变量;如何做,请提供任何解决方案。

我正在使用这段代码,这里的 OS.version 属性应该从 catalina.bat 文件中缓存 OS 版本,类似的 UNIX 代码可以正常工作,但是在 Windows 上出现问题,我想知道问题出在哪里。

<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

最后但并非最不重要的,有人能回答或建议我上一个评论查询的解决方法吗?这个愚蠢的问题


1
我想知道这个踩票的原因是什么?对于一个新用户来说,没有提供关于原因的建设性反馈就进行踩票有点令人沮丧。 - ewan.chalmers
我认为你试图从catalina.bat的输出中提取操作系统版本,这样做会使事情变得过于复杂。我认为你可以使用内置的Ant属性和条件来获取所需内容。 - ewan.chalmers
实际上,我的代码从catalina.bat中提取操作系统版本和tomcat版本,这就是我在查找catalina.bat的原因。正如您所说,Tomcat是运行时配置。因此,无法使用属性直接通过ant进行检测。我的主要目的不是设置CATALINA_HOME,而是找出tomcat版本。对于我的问题,如果有其他方法可以找到tomcat版本,那么请多多包涵,我认为设置catalina_home可能会解决这个问题。 - user1037728
3个回答

2
如果我理解正确,您正在从Ant执行此OS检测。在这种情况下,您是否可以使用Ant内置的支持来识别操作系统 - 在os条件中?
但是,如果您确实需要在设置CATALINA_HOME的同时执行catalina.bat,则可以在您exec任务中使用嵌套的 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)环境变量。另外,您也可以使用嵌套的元素传递这些变量,如之前所讨论的一样。但是,这些变量更可能来自运行时环境,而不是嵌入在您的构建文件中。

这里的三个点是什么意思? <exec ...> - user1037728
问题:无法创建任务或类型 env 原因:名称未定义。 操作:检查拼写。 操作:检查是否已声明任何自定义任务/类型。 操作:检查是否已进行任何<presetdef>/<macrodef>声明。 我遇到了这个错误 - user1037728
我在我的exec任务之外放置了<env key="CATALINA_HOME" value="whatever_value_you_want"/>,但是它出现了我在注释中提到的错误。 - user1037728
太好了,我使用了第二种方法,它很好地工作了..谢谢..我能否使用类似的Ant属性来检测我的Tomcat版本??? - user1037728
还有一个愚蠢的问题,这些属性提供了内部约定...是否可能获取最终用户约定...我的意思是...我在Windows 2008 R2服务器上执行它...我得到了这个输出[echo] os.arch: amd64 [echo] os.name: Windows Server 2008 [echo] os.version: 6.0 我能否改为获取os.name:Windows 2008 R2? - user1037728
显示剩余5条评论

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>

`<target name="cattest"> <condition property="catalina.path" value="${MY_proj}\tomcat\bin\catalina.bat"> <os family="windows"/> </condition> <!-- Get OS Version --> <exec executable="${catalina.path}" outputproperty="OS.version"> <arg value="version" /> <redirector> <outputfilterchain> <tokenfilter> <containsstring contains="OS Name:"/> <replacestring from="OS Name: " to=""/> </tokenfilter> </outputfilterchain> </redirector> </exec> <echo message="${OS.version}"/> </target>` - user1037728
@user1037728 不知道你在做什么。 - FailedDev

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接