Tôi đã sử dụng TMP
biến môi trường để kiểm soát những thứ như nơi gcc ghi nó là các tệp tạm thời, nhưng tôi dường như không thể tìm thấy một biến tương đương cho createTempFile của java API .
Một biến môi trường như vậy có tồn tại không?
Tôi đã sử dụng TMP
biến môi trường để kiểm soát những thứ như nơi gcc ghi nó là các tệp tạm thời, nhưng tôi dường như không thể tìm thấy một biến tương đương cho createTempFile của java API .
Một biến môi trường như vậy có tồn tại không?
Câu trả lời:
Hmmm - vì điều này được xử lý bởi JVM, tôi đã đi sâu vào mã nguồn OpenJDK VM một chút, nghĩ rằng có thể những gì được thực hiện bởi OpenJDK bắt chước những gì được thực hiện bởi Java 6 trở về trước. Thật không yên tâm rằng có một cách để làm điều này ngoài Windows.
Trên Windows , get_temp_directory()
hàm của OpenJDK thực hiện lệnh gọi API Win32 tớiGetTempPath()
; đây là cách trên Windows, Java phản ánh giá trị củaTMP
biến môi trường.
Trên Linux và Solaris , các get_temp_directory()
hàm giống nhau trả về giá trị tĩnh là/tmp/
.
Tôi không biết liệu JDK6 thực sự có tuân theo các quy ước chính xác này hay không, nhưng theo hành vi trên từng nền tảng được liệt kê, có vẻ như chúng làm như vậy.
-Djava.io.tmpdir
tùy chọn dòng lệnh cho JVM) và nếu giá trị mặc định đó bị ảnh hưởng tại tất cả bởi một giá trị môi trường. Khi mọi người đã quan sát, trên Windows nó đang bị ảnh hưởng bởi các TMP
biến môi trường, nhưng nó không rõ ràng nếu có một số biến chưa được biết cho hệ điều hành khác. Có vẻ như không có, ít nhất là với những gì chúng ta biết về OpenJDK.
GetTempPath()
không bị ảnh hưởng chỉ bởi TMP
biến môi trường: msdn.microsoft.com/en-us/library/aa364992%28VS.85%29.aspx
/var/tmp/
(với dấu gạch chéo ở đầu), thậm chí còn có lỗi # 4391434 cho điều đó. Và đối với Mac OS và Linux thì/tmp
- thật là một mớ hỗn độn!
oracle-java8-jdk=8u102
(linux)
Thư mục tệp tạm thời mặc định được chỉ định bởi thuộc tính hệ thống java.io.tmpdir. Trên hệ thống UNIX, giá trị mặc định của thuộc tính này thường là "/ tmp" hoặc "/ var / tmp"; trên hệ thống Microsoft Windows, nó thường là "c: \ temp". Một giá trị khác có thể được cấp cho thuộc tính hệ thống này khi máy ảo Java được gọi, nhưng các thay đổi theo chương trình đối với thuộc tính này không được đảm bảo sẽ có bất kỳ ảnh hưởng nào đến thư mục tạm thời được phương pháp này sử dụng.
Để chỉ định thuộc tính java.io.tmpdir
Hệ thống, bạn có thể gọi JVM như sau:
java -Djava.io.tmpdir=/path/to/tmpdir
Theo mặc định, giá trị này phải đến từ TMP
biến môi trường trên hệ thống Windows
java.io.tmpdir
được xác định bằng cách sử dụng hàm Windows SDK GetTempPath
( msdn.microsoft.com/en-us/library/aa364992%28VS.85%29.aspx ) sẽ phân giải thành TMP hoặc TEMP hoặc USERPROFILE hoặc thư mục Windows nếu mỗi trước đó không được xác định.
Bạn có thể đặt _JAVA_OPTIONS
biến môi trường của mình . Ví dụ trong bash, điều này sẽ thực hiện thủ thuật:
export _JAVA_OPTIONS=-Djava.io.tmpdir=/new/tmp/dir
Tôi đã đưa nó vào tập lệnh đăng nhập bash của mình và nó có vẻ là một mẹo nhỏ.
Picked up _JAVA_OPTIONS:
Điều này hoàn toàn gây nhầm lẫn cho quá trình xây dựng của chúng tôi.
JAVA_TOOL_OPTIONS
là di động hơn.
Sử dụng
$ java -XshowSettings
Property settings:
java.home = /home/nisar/javadev/javasuncom/jdk1.7.0_17/jre
java.io.tmpdir = /tmp
Để rõ ràng về những gì đang xảy ra ở đây:
Cách được khuyến nghị để đặt vị trí thư mục tạm thời là đặt thuộc tính Hệ thống có tên "java.io.tmpdir", ví dụ: bằng cách cung cấp tùy chọn -Djava.io.tmpdir=/mytempdir
cho java
lệnh. Thuộc tính cũng có thể được thay đổi từ bên trong chương trình bằng cách gọi System.setProperty("java.io.tmpdir", "/mytempdir)
... vấn đề bảo mật hộp cát modulo.
Nếu bạn không đặt thuộc tính "java.io.tmpdir" một cách rõ ràng khi khởi động, thì JVM sẽ khởi tạo nó thành một giá trị mặc định dành riêng cho nền tảng . Đối với Windows, mặc định có được bằng cách gọi phương thức Win32 API. Đối với Linux / Solaris, mặc định rõ ràng là có dây cứng. Đối với các JVM khác, nó có thể là một cái gì đó khác.
Theo kinh nghiệm, biến môi trường "TMP" hoạt động trên Windows (với các JVM hiện tại), nhưng không hoạt động trên các nền tảng khác. Nếu bạn quan tâm đến tính di động, bạn nên đặt thuộc tính hệ thống một cách rõ ràng.