2013-07-03 30 views
12

Khi cố gắng để biên dịch một taglet Javadoc, đòi hỏi $JAVA_HOME/lib/tools.jar, tôi phát hiện ra rằng kiến ​​(phiên bản 1.8.4) đặt java.home-$JAVA_HOME/jre thay vì chỉ $JAVA_HOME . Tôi xác nhận này thusly:

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

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

Theo ant -diagnostics, không có bất cứ tài sản như một jdk.home. Vì vậy, để sử dụng tools.jar tôi phải làm:

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

Vì vậy, tôi có hai câu hỏi:

1) Có điều gì sai với thiết lập của tôi về kiến ​​đó là gây java.home để trỏ đến JRE thay cho JDK?

2) Nếu điều này cách kiến ​​được cho là hoạt động, đang sử dụng .. trong đường dẫn lớp của tôi theo cách tôi phải làm việc? Hoặc tôi có nên làm ${env.JAVA_HOME}/lib/tools.jar? Hoặc cái gì khác hoàn toàn?

+0

kiến ​​là tập lệnh hệ vỏ. Hãy thử chạy nó với trình gỡ lỗi vỏ trên (+ x). Đảm bảo rằng java được tìm thấy bởi ant là java thực (không phải bất kỳ liên kết mềm) – Jayan

+0

1) Tôi đã chỉnh sửa kịch bản lệnh shell để đặt 'echo $ JAVA_HOME' ngay trước dòng cuối cùng, và tại thời điểm đó không thay đổi. 2) Tôi đã thử đổi tên thư mục JDK và đặt một liên kết tượng trưng đến tên mới ở vị trí của nó. '$ {java.home}' thay đổi để phản ánh thư mục được đổi tên, vì vậy nó sử dụng đúng thư mục. –

+0

Xin lỗi tôi đã không thấy điều này cho đến bây giờ! – ingyhere

Trả lời

7

Dưới đây là câu trả lời: "Có điều gì sai với thiết lập của tôi ..."

  1. Ant là thiết lập java.home nội bộ của nó dựa trên các thuộc tính của hệ thống JVM. Mã cho HotSpot (JVM internals) đặt nó với "/ jre" được nối vào mục đích. Trong thực tế, các Java(TM) Tutorials for System Properties mô tả nó chính xác theo cách đó. Biến "java.home" từ bên trong ant thực sự không giống với "JAVA_HOME" được thiết lập trong môi trường của bạn - khác nhau nhưng với các tên tương tự.

  2. "(Cái gì) là cách tôi phải làm mọi thứ?" Bạn có thể thực sự làm bất cứ điều gì bạn cảm thấy thích hợp, nhưng hãy nhớ rằng Ant có thể và thường chạy trong một quá trình JVM riêng biệt. Tôi cho rằng môi trường hệ thống của bạn có thể chỉ định JVM đã được sử dụng để phát triển ứng dụng, vì vậy tôi chỉ sử dụng "$ {env.JAVA_HOME}" để đảm bảo rằng các kỳ vọng phát triển đáp ứng kỳ vọng xây dựng.

Để biết thêm thông tin, vui lòng xem another similar answer here.

Ngoài ra, hãy xem xét thêm thông tin có thể được thu thập từ kiến ​​bằng cách chạy nó với cờ -debug, -diagnostics và/hoặc -verbose.

+0

Tôi nhận được cùng một điểm vấn đề kiến ​​JAVA_HOME để JAVA_HOME/jre instate của JAVA_HOME làm thế nào tôi có thể giải quyết vấn đề này? –

+0

Xem nhận xét sau câu hỏi tại đây: http://stackoverflow.com/questions/16533256 – ingyhere

2

Có cùng sự cố. Tôi thấy rằng việc thêm fork="true" vào thẻ javac giải quyết được vấn đề này. Vì vậy, hãy thực hiện điều gì đó như sau:

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

Tôi sẽ cảm ơn bất cứ ai có thể giải thích lý do tại sao lại hoạt động.

+0

Môi trường của bạn có thể đặt $ JAVA_HOME làm đường dẫn JDK. [Tài liệu Ant] (https://ant.apache.org/manual/Tasks/javac.html) nêu rõ (liên quan đến 'fork = true')," Mặc định là trình biên dịch của phiên bản Java hiện đang chạy Ant. " Do đó, bản thân kịch bản lệnh Ant không đặt đường dẫn sai cho JDK - Bạn thực sự phải thay đổi hành vi 'javac' của' fork' để làm điều đó. Các lọ được tìm thấy trong JDK nơi chúng được cho là nằm. – ingyhere

+0

Tôi đã tìm một giải pháp trong 3 giờ. Cuối cùng tôi đã tìm thấy nó. Tôi đã thêm (fork = "true") và giải quyết tất cả các vấn đề của tôi. Để chia sẻ rất nhiều lời cảm ơn. – NovaYear

Các vấn đề liên quan