我有一个脚本检测操作系统使用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}"/>