2010-11-09 34 views
25

Tôi có kịch bản kiến ​​rằng biên dịch:Ant: đi qua compilerarg vào javac

  <javac srcdir="${test.src.dir}" destdir="${test.dist.dir}"> 
       ... 
       <compilerarg value="-Xlint:unchecked" /> 
      </javac> 

tôi cần phải tăng bộ nhớ heap của trình biên dịch, vì vậy tôi đã đưa các đối số sau vào compileargs:

<compilerarg value="-Xlint:unchecked -Xms128m -Xmx512m" /> 

Nhưng tôi gặp lỗi trong bảng điều khiển:

[javac] javac: invalid flag: -Xms128m 
[javac] Usage: javac <options> <source files> 

Tại sao điều đó xảy ra? Làm cách nào để tăng bộ nhớ được sử dụng bởi javac?

+0

có phải lỗi sao chép/dán có giá trị khác với giá trị được cung cấp (32m/128m) không? –

+1

Có thể bạn cần phải vượt qua từng đối số trong một phần tử riêng biệt? – ZeissS

+0

@ZeissS: phần tử '' riêng biệt gây ra lỗi giống nhau không may –

Trả lời

47

Theo mặc định, <javac> chạy trong quá trình với Ant. Đó là một giới hạn chung của Java mà bạn không thể điều chỉnh quy trình JVM 'XmsXmx khi quá trình JVM đã khởi chạy. Vì vậy, thông báo lỗi mà bạn đang nhìn thấy là phần mềm từ chối nỗ lực của bạn để vi phạm nguyên tắc này (sử dụng một, thông báo lỗi không thân thiện vô ích.)

Tuy nhiên, nếu bạn chỉ định các thuộc tính fork="true" trên thẻ <javac> bạn sẽ có thể chỉ định XmsXms mới. Điều này là do fork hướng dẫn Ant khởi chạy một quy trình con JVM mới để chạy javac. Bởi vì quá trình JVM là mới, nó mang lại cho Ant một cơ hội chấp nhận được để chỉ định XmsXmx cho nó.


Bạn có thể thử một cái gì đó như thế này:.

<project name="project" default="all" basedir="[yourvalue]"> 
    <target name="all"> 
     <javac srcdir="[yourvalue]" destdir="[yourvalue]" fork="true"> 
      <!-- javac requires that -Xmx and -Xms be prefixed with -J --> 
      <compilerarg line="-J-Xms128m -J-Xmx512m" /> 
     </javac> 
    </target> 
</project> 

(Chú Tôi đang sử dụng compilerarg line="" hơn compilerarg value="" Thuộc tính line cho phép bạn xác định nhiều đối số không gian tách Thuộc tính value là cho đi qua một. đối số duy nhất.)


Ant sẽ đợi thanh chia <javac> để thoát, điều này xảy ra sau khi quá trình javac hoàn tất công việc của mình (tức là biên dịch). Ant sau đó tiếp tục chạy kịch bản xây dựng bên trong quá trình JVM ban đầu của riêng nó. Ant sẽ kiểm tra xem ngã rẽ javac bị lỗi hay thành công hay không và thực hiện các hành động thông thường dựa trên thông tin này.


Performance

Nó thường performant hơn để không ngã ba javac, và thay vào đó chỉ đơn giản là điều chỉnh các thiết lập bộ nhớ có liên quan cho ban đầu Ant JVM tổng thể. Điều này thường (nhưng không phải lúc nào) là sự lựa chọn tốt nhất bởi vì khởi chạy một JVM riêng biệt thường chậm hơn và mất nhiều bộ nhớ hơn chỉ đơn giản là cho phép javac chạy trong tiến trình.

Nếu bạn đang sử dụng Ant-cung cấp ant.bat hoặc ant.sh để khởi động Ant, một cách dễ dàng để điều chỉnh Ant XmsXmx là xác định môi trường ANT_OPTS biến để chứa các đối số mà bạn muốn. Có nhiều cách để đặt biến môi trường, nhưng bạn chỉ có thể chỉnh sửa ant.bat:

set ANT_OPTS=-Xms128m -Xmx512m 
6

Bạn đã thử <jvmarg value="-Xmx512m" /> trong tác vụ Java chưa? Đối với những cái mặc định, bạn có thể sử dụng biến môi trường ANT_OPTS. Tôi tìm thấy điều này example, không phải là rất hữu ích nhưng có một build.xml.

Để tăng dung lượng vùng lưu trữ Javac, tôi thấy điều này trong khi googling.

<javac fork="true" 
     srcdir="${basedir}/src" 
     destdir="${basedir}/build/classes" 
     classpath="${project.classpath}" 
     memoryinitialsize="256m" 
     memorymaximumsize="256m"> 
</javac> 

Được sao chép từ link này. Đặt ngã ba thành đúng là quan trọng.

+0

xin lỗi nhưng 'jvmarg' không hợp lệ trong tác vụ' javac': 'javac không hỗ trợ phần tử" jvmarg "lồng nhau. ' –

2

Tôi không nghĩ rằng vấn đề này thực sự liên quan đến kiến. Bạn sẽ thấy cùng một thông báo nếu bạn đã thử trực tiếp javac -Xms128m -Xmx512m.

Bạn cần sử dụng tùy chọn -J để chuyển cờ trực tiếp đến hệ thống thời gian chạy. ví dụ.

-J-Xms128m -J-Xmx512m thay vì chỉ -Xms128m -Xmx512m trong số compilerarg.

javac -X là để chuyển các tùy chọn không chuẩn cho trình biên dịch. Nếu bạn chạy lệnh javac -X, nó sẽ hiển thị danh sách các tùy chọn pháp lý bao gồm -Xlint mà bạn đã sử dụng. Các tùy chọn bộ nhớ là các cài đặt cho JVM cơ bản, do đó cần sử dụng -J.

Alternative

memoryInitialSize (tương đương với -Xms) và memoryMaximumSiz e (tương đương với -Xmx) tùy chọn cho nhiệm vụ javac vì vậy hãy thử những thay vì sử dụng compilerargs ví dụ

<javac srcdir="${test.src.dir}" destdir="${test.dist.dir}" 
    memoryInitialSize="128m" 
    memoryMaximumSize="512m"> 
+0

Tiền tố' -J-'mang lại kết quả tương tự:' [javac] javac: cờ không hợp lệ: -J-Xms32m' –

+0

Hãy thử giải pháp thay thế mà tôi đã thêm vào câu trả lời ở trên. – mikej

+0

+1 - Cách thay thế hoạt động, nhưng tôi vẫn muốn tìm ra lý do tại sao không phải '-Xms32m' không phải' -J-Xms32m' không hoạt động –

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