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



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

if exist "%CATALINA_HOME%bincatalina.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

那么OS版本声明没有达到catalina.bat文件,所以解决方案是我猜;使用我的Ant脚本本身显式设置CATALINA_HOME环境变量;

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

<property name="version" location="${My_proj}tomcatbincatalina.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>

问题解决:you were right .

<exec executable="cmd" outputproperty="tomcat.version">
      <arg value="/c"/>
      <arg value="${MY_PROJ}tomcatbinversion.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

最后一个问题我最后的评论查询愚蠢的问题

如果我理解正确,您正在从Ant执行此操作系统检测。在这种情况下,在操作系统条件下,您可以不使用Ant内置的对操作系统标识的支持吗?

但是,如果您确实需要在设置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:tmpant>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%bincatalina.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>元素传递这些变量。但更有可能的是,这些应该来自运行时环境,而不是嵌入到构建文件中。

这样做:

<condition property="catalina.path" value="C:Foocatalina.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。这至少可以追溯到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}"/>

相关内容

  • 没有找到相关文章

最新更新