ฉันใช้TMP
ตัวแปรสภาพแวดล้อมเพื่อควบคุมสิ่งต่างๆเช่นที่ gcc เขียนว่าเป็นไฟล์ชั่วคราว แต่ฉันไม่สามารถหาสิ่งที่เทียบเท่ากับcreateTempFile API ของ java ได้
ตัวแปรสภาพแวดล้อมดังกล่าวมีอยู่จริงหรือไม่?
ฉันใช้TMP
ตัวแปรสภาพแวดล้อมเพื่อควบคุมสิ่งต่างๆเช่นที่ gcc เขียนว่าเป็นไฟล์ชั่วคราว แต่ฉันไม่สามารถหาสิ่งที่เทียบเท่ากับcreateTempFile API ของ java ได้
ตัวแปรสภาพแวดล้อมดังกล่าวมีอยู่จริงหรือไม่?
คำตอบ:
อืมม - เนื่องจากสิ่งนี้จัดการโดย JVM ฉันจึงเจาะลึกซอร์สโค้ด OpenJDK VM เล็กน้อยโดยคิดว่าสิ่งที่ OpenJDK ทำอาจจะเลียนแบบสิ่งที่ทำโดย Java 6 และก่อนหน้านี้ ไม่มั่นใจว่ามีวิธีอื่นนอกเหนือจากบน Windows
บนWindowsget_temp_directory()
ฟังก์ชันของ OpenJDK ทำการเรียก Win32 API ไปที่GetTempPath()
; นี่คือวิธีการบน Windows Java สะท้อนถึงค่าของTMP
ตัวแปรสภาพแวดล้อม
บนลินุกซ์และSolaris , เดียวกันฟังก์ชั่นคืนค่าคงที่ของget_temp_directory()
/tmp/
ฉันไม่รู้ว่า JDK6 จริงเป็นไปตามแบบแผนเหล่านี้หรือไม่ แต่จากพฤติกรรมในแต่ละแพลตฟอร์มที่ระบุไว้ดูเหมือนว่าจะเป็นเช่นนั้น
-Djava.io.tmpdir
ตัวเลือกบรรทัดคำสั่งไปยัง JVM) และหากค่าเริ่มต้นนั้นได้รับผลกระทบที่ ทั้งหมดนี้เป็นไปตามค่าสิ่งแวดล้อม ขณะที่ผู้คนได้ตั้งข้อสังเกตใน Windows มันเป็นผลกระทบจากTMP
ตัวแปรสภาพแวดล้อม แต่มันก็ไม่มีความชัดเจนว่ามีบางตัวแปรที่ไม่รู้จักสำหรับระบบปฏิบัติการอื่น ๆ ดูเหมือนว่าไม่มีอย่างน้อยก็ให้สิ่งที่เรารู้เกี่ยวกับ OpenJDK
GetTempPath()
ไม่ได้รับผลกระทบจากTMP
ตัวแปรสภาพแวดล้อมเท่านั้น: msdn.microsoft.com/en-us/library/aa364992%28VS.85%29.aspx
/var/tmp/
(ด้วยเครื่องหมายทับ) มีข้อผิดพลาด # 4391434สำหรับสิ่งนั้น และสำหรับ Mac OS และ Linux มันเป็น/tmp
อะไรที่วุ่นวาย!
oracle-java8-jdk=8u102
(linux)
อ้างอิงจากjava.io.File
Java Docs
ไดเร็กทอรีไฟล์ชั่วคราวดีฟอลต์ถูกระบุโดยคุณสมบัติระบบ java.io.tmpdir ในระบบ UNIX ค่าดีฟอลต์ของคุณสมบัตินี้โดยทั่วไปคือ "/ tmp" หรือ "/ var / tmp"; ในระบบ Microsoft Windows โดยทั่วไปจะเป็น "c: \ temp" อาจมีการกำหนดค่าที่แตกต่างกันให้กับคุณสมบัติระบบนี้เมื่อเรียกใช้เครื่องเสมือน Java แต่การเปลี่ยนแปลงทางโปรแกรมของคุณสมบัตินี้ไม่ได้รับการรับรองว่าจะมีผลกระทบใด ๆ กับไดเร็กทอรีชั่วคราวที่ใช้โดยวิธีนี้
ในการระบุjava.io.tmpdir
คุณสมบัติ System คุณสามารถเรียกใช้ JVM ได้ดังนี้:
java -Djava.io.tmpdir=/path/to/tmpdir
โดยค่าเริ่มต้นค่านี้ควรมาจากTMP
ตัวแปรสภาพแวดล้อมในระบบ Windows
java.io.tmpdir
กำหนดโดยใช้ฟังก์ชัน Windows SDK GetTempPath
( msdn.microsoft.com/en-us/library/aa364992%28VS.85%29.aspx ) ซึ่งจะแก้ไขเป็น TMP หรือ TEMP หรือ USERPROFILE หรือไดเร็กทอรี Windows หากแต่ละ ก่อนหน้านี้ไม่ได้กำหนดไว้
คุณสามารถตั้งค่า_JAVA_OPTIONS
ตัวแปรสภาพแวดล้อมได้ ตัวอย่างเช่นในการทุบตีสิ่งนี้จะทำเคล็ดลับ:
export _JAVA_OPTIONS=-Djava.io.tmpdir=/new/tmp/dir
ฉันใส่ลงในสคริปต์การเข้าสู่ระบบ bash ของฉันและดูเหมือนว่าจะทำเคล็ดลับ
Picked up _JAVA_OPTIONS:
สิ่งนี้ทำให้กระบวนการสร้างของเราสับสนอย่างสิ้นเชิง
JAVA_TOOL_OPTIONS
เป็นแบบพกพามากขึ้น
ใช้
$ java -XshowSettings
Property settings:
java.home = /home/nisar/javadev/javasuncom/jdk1.7.0_17/jre
java.io.tmpdir = /tmp
ไม่ใช่ตัวแปรสภาพแวดล้อม แต่ยังให้คุณควบคุม temp dir:
-Djava.io.tmpdir
เช่น:
java -Djava.io.tmpdir=/mytempdir
เพื่อให้ชัดเจนว่าเกิดอะไรขึ้นที่นี่:
วิธีที่แนะนำในการตั้งค่าตำแหน่งไดเร็กทอรีชั่วคราวคือการตั้งค่าคุณสมบัติของระบบที่เรียกว่า "java.io.tmpdir" เช่นโดยให้อ็อพชัน-Djava.io.tmpdir=/mytempdir
แก่java
คำสั่ง คุณสมบัตินี้ยังสามารถเปลี่ยนแปลงได้จากภายในโปรแกรมโดยโทรSystem.setProperty("java.io.tmpdir", "/mytempdir)
... ปัญหาด้านความปลอดภัย modulo sandbox
หากคุณไม่ได้ตั้งค่าคุณสมบัติ "java.io.tmpdir" ไว้อย่างชัดเจนเมื่อเริ่มต้น JVM จะเตรียมข้อมูลเบื้องต้นให้เป็นค่าเริ่มต้นเฉพาะแพลตฟอร์ม สำหรับ Windows ค่าเริ่มต้นจะได้มาจากการเรียกใช้เมธอด Win32 API สำหรับ Linux / Solaris ค่าเริ่มต้นคือสายฮาร์ด สำหรับ JVM อื่น ๆ อาจเป็นอย่างอื่นก็ได้
ในเชิงประจักษ์ตัวแปรสภาพแวดล้อม "TMP" ทำงานบน Windows (ที่มี JVM ปัจจุบัน) แต่จะไม่ทำงานบนแพลตฟอร์มอื่น หากคุณสนใจเกี่ยวกับการพกพาคุณควรตั้งค่าคุณสมบัติของระบบอย่างชัดเจน
ใช้คำสั่งด้านล่างบน UNIX terminal:
java -XshowSettings
ซึ่งจะแสดงคุณสมบัติ java และการตั้งค่าระบบทั้งหมด ในรูปลักษณ์นี้เพื่อความjava.io.tmpdir
คุ้มค่า