ตัวแปรสภาพแวดล้อมเพื่อควบคุม java.io.tmpdir?


110

ฉันใช้TMPตัวแปรสภาพแวดล้อมเพื่อควบคุมสิ่งต่างๆเช่นที่ gcc เขียนว่าเป็นไฟล์ชั่วคราว แต่ฉันไม่สามารถหาสิ่งที่เทียบเท่ากับcreateTempFile API ของ java ได้

ตัวแปรสภาพแวดล้อมดังกล่าวมีอยู่จริงหรือไม่?


ลิงค์จริงคือjava.sun.com/javase/6/docs/api/java/io/… , java.lang.String, java.io.File) Stackoverflow ไม่ทำสิ่งที่ถูกต้องเมื่อฉันใส่ URL นั้น (หรือเมื่อฉันแทนที่วงเล็บด้วย% 28 และ% 29) ฉันรู้ว่าการใช้ url แบบสั้นมันแย่ แต่ฉันคิดว่ามันดีกว่าไม่มีลิงค์เลย
Zach Hirsch

ฉันแก้ไขลิงค์แล้ว ดังนั้นสิ่งที่ถูกต้องก็ดี
rmeador

1
ขอบคุณ. ฉันเดาว่าเคล็ดลับก็แทนที่ช่องว่างด้วย% 20
Zach Hirsch

1
ทั้งหมดที่ฉันทำคือไปที่ลิงค์ของคุณคัดลอก URL ออกจากแถบที่อยู่ของเบราว์เซอร์ของฉันและวางลงในโพสต์ของคุณโดยที่ลิงก์สั้น ๆ ของคุณอยู่
rmeador

คำตอบ:


118

อืมม - เนื่องจากสิ่งนี้จัดการโดย JVM ฉันจึงเจาะลึกซอร์สโค้ด OpenJDK VM เล็กน้อยโดยคิดว่าสิ่งที่ OpenJDK ทำอาจจะเลียนแบบสิ่งที่ทำโดย Java 6 และก่อนหน้านี้ ไม่มั่นใจว่ามีวิธีอื่นนอกเหนือจากบน Windows

บนWindowsget_temp_directory()ฟังก์ชันของ OpenJDK ทำการเรียก Win32 API ไปที่GetTempPath(); นี่คือวิธีการบน Windows Java สะท้อนถึงค่าของTMPตัวแปรสภาพแวดล้อม

บนลินุกซ์และSolaris , เดียวกันฟังก์ชั่นคืนค่าคงที่ของget_temp_directory()/tmp/

ฉันไม่รู้ว่า JDK6 จริงเป็นไปตามแบบแผนเหล่านี้หรือไม่ แต่จากพฤติกรรมในแต่ละแพลตฟอร์มที่ระบุไว้ดูเหมือนว่าจะเป็นเช่นนั้น


39
เพื่อความชัดเจนสิ่งที่คุณกำลังดูคือโค้ดเนทีฟที่ให้ค่าดีฟอลต์สำหรับคุณสมบัติ "java.io.tmpdir" เมื่อ JVM สร้างอ็อบเจ็กต์คุณสมบัติของระบบ สิ่งนี้จะถูกแทนที่โดย (เช่น) ตัวเลือก "-Djava.io.tmpdir = ... "
Stephen C

6
@StephenC ใช่นั่นคือประเด็น - OP กำลังมองหาว่าค่าเริ่มต้นสำหรับคุณสมบัติได้รับการตั้งค่าอย่างไรในกรณีที่ไม่มีการตั้งค่าด้วยตัวเอง (ผ่านทาง-Djava.io.tmpdirตัวเลือกบรรทัดคำสั่งไปยัง JVM) และหากค่าเริ่มต้นนั้นได้รับผลกระทบที่ ทั้งหมดนี้เป็นไปตามค่าสิ่งแวดล้อม ขณะที่ผู้คนได้ตั้งข้อสังเกตใน Windows มันเป็นผลกระทบจากTMPตัวแปรสภาพแวดล้อม แต่มันก็ไม่มีความชัดเจนว่ามีบางตัวแปรที่ไม่รู้จักสำหรับระบบปฏิบัติการอื่น ๆ ดูเหมือนว่าไม่มีอย่างน้อยก็ให้สิ่งที่เรารู้เกี่ยวกับ OpenJDK
delfuego

5
คำตอบที่ดี แต่บน Windows GetTempPath()ไม่ได้รับผลกระทบจากTMPตัวแปรสภาพแวดล้อมเท่านั้น: msdn.microsoft.com/en-us/library/aa364992%28VS.85%29.aspx
Dan Berindei

ฉันเคยเห็นว่าใน Solaris Sun JDK ค่าเป็น/var/tmp/(ด้วยเครื่องหมายทับ) มีข้อผิดพลาด # 4391434สำหรับสิ่งนั้น และสำหรับ Mac OS และ Linux มันเป็น/tmpอะไรที่วุ่นวาย!
dma_k

1
@Znik ทำงานร่วมกับoracle-java8-jdk=8u102(linux)
Alex

118

อ้างอิงจากjava.io.FileJava 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


1
สิ่งนี้ไม่ตอบคำถามของฉัน มีตัวแปรสภาพแวดล้อมที่ควบคุมสิ่งนี้หรือไม่?
Zach Hirsch

3
แม้จะมีการแก้ไขของคุณ Bryan, java.io.tmpdir ก็ไม่ปฏิบัติตามตัวแปรสภาพแวดล้อม TMPDIR บน Mac หรือบน Ubuntu (ทดสอบบน 6.06)
delfuego

Oy และการแก้ไขอีกครั้งทำให้ความคิดเห็นเหล่านี้ดูเหมือนไร้สาระ
delfuego

@ แซค. คำตอบคือเฉพาะแพลตฟอร์ม
Stephen C

12
มันไม่ง่ายอย่างนั้นและคำตอบนี้ก็ยังไม่ถูกต้อง บน Windows java.io.tmpdirกำหนดโดยใช้ฟังก์ชัน Windows SDK GetTempPath( msdn.microsoft.com/en-us/library/aa364992%28VS.85%29.aspx ) ซึ่งจะแก้ไขเป็น TMP หรือ TEMP หรือ USERPROFILE หรือไดเร็กทอรี Windows หากแต่ละ ก่อนหน้านี้ไม่ได้กำหนดไว้
Pascal Thivent

62

คุณสามารถตั้งค่า_JAVA_OPTIONSตัวแปรสภาพแวดล้อมได้ ตัวอย่างเช่นในการทุบตีสิ่งนี้จะทำเคล็ดลับ:

export _JAVA_OPTIONS=-Djava.io.tmpdir=/new/tmp/dir

ฉันใส่ลงในสคริปต์การเข้าสู่ระบบ bash ของฉันและดูเหมือนว่าจะทำเคล็ดลับ


3
แม้ว่าสิ่งนี้จะใช้งานได้กับ Linux และ MacOSX แต่ก็มีผลข้างเคียงที่น่าเสียดายในการพิมพ์เอาต์พุตเพิ่มเติมบางส่วนในการเปิดตัว Java ทุกครั้ง: Picked up _JAVA_OPTIONS:สิ่งนี้ทำให้กระบวนการสร้างของเราสับสนอย่างสิ้นเชิง
marc.guenther

3
ฉันโหวตคำตอบนี้เนื่องจากตอบคำถามผู้ใช้และผู้ใช้ไม่ได้ระบุระบบปฏิบัติการหรือต้องการหลีกเลี่ยงผลกระทบด้านอื่น ๆ ฉันเชื่อว่านี่ควรจะเป็นคำตอบที่ดีที่สุด
R. van Twisk

3
ตัวแปรนี้ดูเหมือนจะเฉพาะสำหรับ Sun JVM - เนื่องจาก IBM J9 JVM ไม่สนับสนุน มันรองรับ IBM_JAVA_OPTIONS แทน
sendmoreinfo

@sendmoreinfo มันใช้ได้กับ Sun / Oracle และ OpenJDK สำหรับความรู้ของฉัน
John St.John

1
ตามคำตอบนี้เกี่ยวกับความแตกต่างระหว่างตัวแปรสภาพแวดล้อมJAVA_TOOL_OPTIONSเป็นแบบพกพามากขึ้น
EndlosSchleife


28

ไม่ใช่ตัวแปรสภาพแวดล้อม แต่ยังให้คุณควบคุม temp dir:

-Djava.io.tmpdir

เช่น:

java -Djava.io.tmpdir=/mytempdir

17

เพื่อให้ชัดเจนว่าเกิดอะไรขึ้นที่นี่:

  • วิธีที่แนะนำในการตั้งค่าตำแหน่งไดเร็กทอรีชั่วคราวคือการตั้งค่าคุณสมบัติของระบบที่เรียกว่า "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 ปัจจุบัน) แต่จะไม่ทำงานบนแพลตฟอร์มอื่น หากคุณสนใจเกี่ยวกับการพกพาคุณควรตั้งค่าคุณสมบัติของระบบอย่างชัดเจน


2

ใช้คำสั่งด้านล่างบน UNIX terminal:

java -XshowSettings

ซึ่งจะแสดงคุณสมบัติ java และการตั้งค่าระบบทั้งหมด ในรูปลักษณ์นี้เพื่อความjava.io.tmpdirคุ้มค่า

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.