如何在Ant的exec任务中更改路径变量?

3
我尝试使用这个链接ant exec任务中设置Path变量,但不知为何它并没有起作用。我正在尝试添加THRIFT_HOMEbasedir,而thrift.exe文件就在basedir中。
此外,当我将executable attribute value的值更改为thrift.exe时,Thrift编译器可以正常工作,但是basedir并未被添加到Path中。
<exec executable="thrift">
    <env key="Path" value="${env.Path};${THRIFT_HOME}" />
</exec>

我也尝试使用setx命令,如下所示:
<exec executable="setx">
    <arg value="Path"/>
    <arg value="%Path%;${THRIFT_HOME}"/>
</exec>

但是它仍然不起作用。

非常感谢您的帮助!


Ant似乎有时会“统一”环境变量,即通过将其全部大写来实现...您是否尝试设置key="PATH"而不是key="Path" - Clemens Klein-Robbenhaar
是的,已经尝试过了。。 - TechSpellBound
可能是如何从Ant脚本设置路径环境变量的重复问题。 - Pavlo
4个回答

1
我目前正在使用 Windows 7,问题出在文件夹名称中存在空格。这在 Windows 上工作时是个大问题。
我尝试将 thrift 可执行文件放置于 /d/thrift/ 并分配 THRIFT_HOME = /d/thrift。然后我尝试了 /d/thrift demo/,但是出现了问题。
D:\noknok_fido_to_ostp\noknok_fido_to_ostp_workspace\Demo\build.xml:33: Execute failed: java.io.IOException: Cannot run program "thrift-0.9.0.exe": CreateProces
s error=2, The system cannot find the file specified
        at java.lang.ProcessBuilder.start(ProcessBuilder.java:460)
        at java.lang.Runtime.exec(Runtime.java:593)
        at org.apache.tools.ant.taskdefs.Execute$Java13CommandLauncher.exec(Execute.java:862)
        at org.apache.tools.ant.taskdefs.Execute.launch(Execute.java:481)
        at org.apache.tools.ant.taskdefs.Execute.execute(Execute.java:495)
        at org.apache.tools.ant.taskdefs.ExecTask.runExecute(ExecTask.java:631)
        at org.apache.tools.ant.taskdefs.ExecTask.runExec(ExecTask.java:672)
        at org.apache.tools.ant.taskdefs.ExecTask.execute(ExecTask.java:498)
        at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291)
        at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
        at org.apache.tools.ant.Task.perform(Task.java:348)
        at org.apache.tools.ant.Target.execute(Target.java:392)
        at org.apache.tools.ant.Target.performTasks(Target.java:413)
        at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1399)
        at org.apache.tools.ant.Project.executeTarget(Project.java:1368)
        at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
        at org.apache.tools.ant.Project.executeTargets(Project.java:1251)
        at org.apache.tools.ant.Main.runBuild(Main.java:811)
        at org.apache.tools.ant.Main.startAnt(Main.java:217)
        at org.apache.tools.ant.launch.Launcher.run(Launcher.java:280)
        at org.apache.tools.ant.launch.Launcher.main(Launcher.java:109)
Caused by: java.io.IOException: CreateProcess error=2, The system cannot find the file specified
        at java.lang.ProcessImpl.create(Native Method)
        at java.lang.ProcessImpl.<init>(ProcessImpl.java:81)
        at java.lang.ProcessImpl.start(ProcessImpl.java:30)
        at java.lang.ProcessBuilder.start(ProcessBuilder.java:453)
        ... 23 more

另一个问题是在Eclipse Ant插件构建中,/d/thrift无法工作。我尝试使用命令提示符进行构建,构建成功了。
这教会了我们一个新的课程:总是从命令提示符进行构建! 感谢回答这个问题的所有人。

为什么要踩我??我不需要赏金!!只是为了避免更多的回答,所以我接受了这个答案!! - TechSpellBound
我点了踩因为它不是对问题的回答(请注意,我点了赞问题,因为我认为它很有趣) - ben75
好的...你尝试使用反斜杠转义空格了吗?它是否起作用了? - ben75

1

0

那么searchpath属性呢?

searchpath:当此属性为true时,在解析可执行文件的位置时将搜索系统路径环境变量。自Ant 1.6.3以来。

所以我认为应该这样:

    <exec executable="thrift" searchpath="true">
       <env key="Path" value="${env.Path};${THRIFT_HOME}" />
    </exec>

应该可以工作。


谢谢回复!很高兴知道searchpath,但实际答案在下面。 - TechSpellBound
1
嗯...你接受的回答很可能是解决你问题的方案,但无论如何,它也是你自己问题的答案。 - ben75
是的。很抱歉。Windows 7 应该已经列入了问题要求中。 - TechSpellBound

0

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