我有一个脚本可以使用 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
最后不能给任何人回答或建议我最后一次评论的问题愚蠢的问题
答案 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}"/>