2013-07-03 252 views
12

当尝试编译的Javadoc Taglet的,这需要$JAVA_HOME/lib/tools.jar,我发现,蚂蚁(1.8.4版本)设置java.home$JAVA_HOME/jre,而不是仅仅$JAVA_HOME 。我验证了这一点正是如此:

<echo>${java.home}</echo> 
<echo>${env.JAVA_HOME}</echo> 

[echo] /usr/java/jdk1.7.0_21/jre 
[echo] /usr/java/jdk1.7.0_21 

ant -diagnostics,没有像jdk.home任何财产。因此,使用tools.jar我必须做的:

<classpath location="${java.home}/../lib/tools.jar"/> 

所以,我有两个问题:

1)是不是有什么毛病我蚂蚁的设置是造成java.home指向JRE而不是JDK?

2)如果蚂蚁应该工作,用我的类路径中..我应该做的事情的方式方法是什么?或者我应该做${env.JAVA_HOME}/lib/tools.jar?还是其他什么东西?

+0

ant是一个shell脚本。尝试在(+ x)​​上运行shell调试。确保ant找到的java是真正的java(没有任何软链接) – Jayan

+0

1)我编辑了shell脚本,在最后一行之前放置'echo $ JAVA_HOME',并且在那个地方没有改变。 2)我尝试重命名JDK目录,并在其位置放置符号链接到新名称。 '$ {java.home}'更改为反映重命名的目录,因此它使用正确的目录。 –

+0

对不起,我直到现在才看到! – ingyhere

回答

7

下面是正确答案: “是不是有什么毛病我设置...”

  1. 不。Ant是基于JVM系统属性设置它的内部java.home。 HotSpot(JVM内部)的代码将其设置为“/ jre”。实际上,Java(TM) Tutorials for System Properties就是这样描述的。来自ant内部的“java.home”变量实际上与您在环境中设置的“JAVA_HOME”不同 - 它们是不同的,但名称相似。

  2. “(什么)我应该做的事情?”你可以真正做你认为合适的事情,但要记住,Ant可以并且通常在单独的JVM进程中运行。我假设你的系统环境可能指定了用于开发应用程序的JVM,所以我只是使用“$ {env.JAVA_HOME}”来确保开发期望满足构建期望。

欲了解更多信息,请参阅another similar answer here

另外,考虑可以通过使用-debug,-diagnostics和/或-verbose标志运行它来从ant收集更多信息。

+0

我得到了同样的问题ant JAVA_HOME到JAVA_HOME/jre instate的JAVA_HOME如何解决这个问题? –

+0

请参阅此问题后的注释:http://stackoverflow.com/questions/16533256 – ingyhere

2

有同样的问题。我发现将fork="true"添加到javac标签可解决此问题。所以做这样的事情:

<javac target="1.7" source="1.7" fork="true" ...> 

我会感谢谁能解释为什么这个工程。

+0

您的环境很可能将$ JAVA_HOME设置为JDK路径。 [Ant文档](https://ant.apache.org/manual/Tasks/javac.html)声明(关于'fork = true'),“默认为当前运行Ant的Java版本的编译器。”因此,Ant脚本本身并没有给JDK设置错误的路径 - 你必须改变'fork'的'javac'行为才能做到这一点。这些罐子在JDK中找到,它们应该位于该处。 – ingyhere

+0

我寻找了3个小时的解决方案。我终于找到了它。我添加了(fork =“true”)并解决了我所有的问题。分享这么多的感激之情。 – NovaYear