Biến môi trường để kiểm soát java.io.tmpdir?


109

Tôi đã sử dụng TMPbiế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?


Liên kết thực tế là java.sun.com/javase/6/docs/api/java/io/… , java.lang.String, java.io.File) Stackoverflow không hoạt động đúng khi tôi đặt URL đó vào (hoặc khi tôi thay dấu ngoặc đơn bằng% 28 và% 29). Tôi biết việc sử dụng url ngắn rất tệ, nhưng tôi thấy nó tốt hơn là không có liên kết nào cả.
Zach Hirsch

Tôi đã sửa liên kết. VẬY làm đúng điều tốt.
rmeador 17/12/09

1
Cảm ơn. Tôi đoán lừa cũng được thay thế không gian với% 20
Zach Hirsch

1
tất cả những gì tôi đã làm là theo liên kết của bạn, sao chép URL ra khỏi thanh địa chỉ của trình duyệt và dán nó vào bài đăng của bạn nơi có liên kết ngắn của bạn.
rmeador 17/12/09

Câu trả lời:


118

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 LinuxSolaris , 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.


38
Để rõ ràng hơn, những gì bạn đang xem là mã gốc cung cấp giá trị mặc định cho thuộc tính "java.io.tmpdir" khi JVM tạo đối tượng Thuộc tính hệ thống. Điều này sẽ bị ghi đè bởi (ví dụ) tùy chọn "-Djava.io.tmpdir = ...".
Stephen C

6
@StephenC, vâng, đó là vấn đề - OP đang tìm cách đặt giá trị mặc định cho thuộc tính trong trường hợp không tự thiết lập nó (thông qua -Djava.io.tmpdirtù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 TMPbiế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.
delfuego

5
Câu trả lời hay, nhưng trên Windows GetTempPath()không bị ảnh hưởng chỉ bởi TMPbiến môi trường: msdn.microsoft.com/en-us/library/aa364992%28VS.85%29.aspx
Dan Berindei

Tôi đã thấy rằng trên Solaris Sun JDK có giá trị là /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!
dma_k

1
@Znik không hoạt động với oracle-java8-jdk=8u102(linux)
Alex

118

Theo java.io.FileJava Docs

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.tmpdirHệ 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ừ TMPbiến môi trường trên hệ thống Windows


1
Điều này không trả lời câu hỏi của tôi. Có biến môi trường nào kiểm soát điều này không?
Zach Hirsch

3
Bất chấp bản chỉnh sửa của bạn, Bryan, java.io.tmpdir chắc chắn không tuân theo biến môi trường TMPDIR trên Mac hoặc trên Ubuntu (được thử nghiệm trên 6.06).
delfuego

Oy, và một chỉnh sửa khác, làm cho tất cả những nhận xét này có vẻ vô nghĩa.
delfuego

@Zach. Câu trả lời là nền tảng cụ thể.
Stephen C

12
Nó không đơn giản như vậy và câu trả lời này vẫn không chính xác. Trên 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.
Pascal Thivent

62

Bạn có thể đặt _JAVA_OPTIONSbiế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ỏ.


3
Trong khi điều này dường như hoạt động trên Linux và MacOSX, nó có tác dụng phụ đáng tiếc là in thêm một số đầu ra trên mỗi lần khởi chạy java: 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.
marc.guenther

3
Tôi đã bỏ phiếu cho câu trả lời này vì nó trả lời câu hỏi của người dùng và người dùng không chỉ định hệ điều hành hoặc muốn tránh bất kỳ ảnh hưởng nào khác. Tôi tin rằng điều này sẽ được thiết lập như là câu trả lời tốt nhất
R. van Twisk

3
Biến này dường như dành riêng cho Sun JVM - vì IBM J9 JVM không hỗ trợ nó; nó IBM_JAVA_OPTIONS bộ phận hỗ trợ
sendmoreinfo

@sendmoreinfo, nó hoạt động cho Sun / Oracle và OpenJDK theo hiểu biết của tôi.
John St. John

1
Theo câu trả lời này về sự khác biệt giữa các biến môi trường, JAVA_TOOL_OPTIONSlà di động hơn.
EndlosSchleife

38

Sử dụng

$ java -XshowSettings
Property settings:
    java.home = /home/nisar/javadev/javasuncom/jdk1.7.0_17/jre
    java.io.tmpdir = /tmp

28

Nó không phải là một biến môi trường, nhưng vẫn cung cấp cho bạn quyền kiểm soát đối với dir tạm thời:

-Djava.io.tmpdir

Ví dụ.:

java -Djava.io.tmpdir=/mytempdir

17

Để 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=/mytempdircho javalệ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.


2

Sử dụng lệnh dưới đây trên thiết bị đầu cuối UNIX:

java -XshowSettings

Điều này sẽ hiển thị tất cả các thuộc tính java và cài đặt hệ thống. Trong điều này tìm kiếm java.io.tmpdirgiá trị.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.