Java ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์หน้าต่าง X11 โดยใช้ 'localhost: 10.0' เป็นค่าของตัวแปร DISPLAY


97

ฉันมีสคริปต์ที่ใช้ java เพื่อเชื่อมต่อเพื่อแสดง X11 ในพอร์ต 10.0 ที่ localhost

แต่ฉันมักจะได้รับข้อผิดพลาดนี้

java.lang.InternalError: Can't connect to X11 window server using 'localhost:10.0' as the value of the DISPLAY variable.
    at sun.awt.X11GraphicsEnvironment.initDisplay(Native Method)
    at sun.awt.X11GraphicsEnvironment.access$200(X11GraphicsEnvironment.java:62)
    at sun.awt.X11GraphicsEnvironment$1.run(X11GraphicsEnvironment.java:178)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.awt.X11GraphicsEnvironment.<clinit>(X11GraphicsEnvironment.java:142)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:186)
    at java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment(GraphicsEnvironment.java:82)
    at sun.awt.X11.XToolkit.<clinit>(XToolkit.java:112)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:186)
    at java.awt.Toolkit$2.run(Toolkit.java:849)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.awt.Toolkit.getDefaultToolkit(Toolkit.java:841)
    at ij.io.Opener.openJpegOrGif(Opener.java:367)
    at ij.io.Opener.openImage(Opener.java:220)
    at ij.io.Opener.openImage(Opener.java:249)
    at ij.io.Opener.open(Opener.java:116)
    at ij.IJ.open(IJ.java:1112)
    at ij.macro.Functions.open(Functions.java:2006)
    at ij.macro.Functions.doFunction(Functions.java:129)
    at ij.macro.Interpreter.doStatement(Interpreter.java:205)
    at ij.macro.Interpreter.doBlock(Interpreter.java:515)
    at ij.macro.Interpreter.runUserFunction(Interpreter.java:278)
    at ij.macro.Interpreter.getFactor(Interpreter.java:1200)
    at ij.macro.Interpreter.getTerm(Interpreter.java:1162)
    at ij.macro.Interpreter.getExpression(Interpreter.java:1145)
    at ij.macro.Interpreter.getBooleanExpression(Interpreter.java:881)
    at ij.macro.Interpreter.getLogicalExpression(Interpreter.java:857)
    at ij.macro.Interpreter.getBoolean(Interpreter.java:850)
    at ij.macro.Interpreter.doIf(Interpreter.java:829)
    at ij.macro.Interpreter.doStatement(Interpreter.java:217)
    at ij.macro.Interpreter.doBlock(Interpreter.java:515)
    at ij.macro.Interpreter.doStatement(Interpreter.java:241)
    at ij.macro.Interpreter.doIf(Interpreter.java:831)
    at ij.macro.Interpreter.doStatement(Interpreter.java:217)
    at ij.macro.Interpreter.doStatements(Interpreter.java:195)
    at ij.macro.Interpreter.run(Interpreter.java:99)
    at ij.macro.Interpreter.run(Interpreter.java:65)
    at ij.macro.Interpreter.run(Interpreter.java:75)
    at ij.plugin.Macro_Runner.runMacro(Macro_Runner.java:127)
    at ij.plugin.Macro_Runner.runMacroFile(Macro_Runner.java:112)
    at ij.IJ.runMacroFile(IJ.java:103)
    at ij.ImageJ.main(ImageJ.java:517)

ฉันได้ลองทุกอย่างเพื่อแก้ปัญหานี้เช่น:

export DISPLAY=:10.0
export DISPLAY=localhost:10.0

ฉันลองพอร์ต 0.0 ด้วย แต่ฉันได้รับข้อผิดพลาดเดียวกันเสมอ

หลังจากลอง xhost

xhost +local:all
xhost:  unable to open display ""
xhost:  unable to open display ":10.0"

ฉันจะแก้ไขสิ่งนี้ได้อย่างไรฉันคิดว่า X Server ไม่ทำงานดังนั้นฉันจึงลองstartxบอกว่ามันทำงานที่พอร์ตนั้น

ระบบของฉันคือเซิร์ฟเวอร์ Ubuntu รุ่น 10.04

คำตอบ:


37

คำสั่งนี้ช่วยฉันแก้ปัญหา:

export DISPLAY=:0

41
unset DISPLAYช่วยฉันด้วย ( export DISPLAY=:0ฉันได้รับข้อผิดพลาดCan't connect to X11 window server using ':0'
beluchin

2
คุณวางไว้ที่ไหน
Spektakulatius

1
บางครั้ง - มันจะไม่ทำงานบน linux ดังนั้นจึงเป็นการดีที่จะติดตั้ง Xvfb ด้วย apt และเรียกใช้บนหน้าจอใด ๆ เช่น: Xvfb: 1 จากนั้นตั้งค่าตัวแปรในขั้นตอนการสร้าง - ส่งออก DISPLAY =: 1 -> สิ่งนี้ใช้งานได้อย่างสมบูรณ์แบบ
Pankaj Kumar Katiyar


เหตุผลใดสำหรับพฤติกรรมนี้?
Annapoorni D

61

คุณต้องระบุ-Djava.awt.headless=trueพารามิเตอร์เมื่อเริ่มต้น


ขอบคุณมาก แต่ฉันต้องระบุสิ่งนี้ตรงไหน?
Elteroooo

1
ข้อยกเว้นในเธรด "หลัก" java.awt เขา adlessException ที่ java.awt.GraphicsEnvironment.checkHeadless (GraphicsEnvironment.java:1 73)
Elteroooo

คุณใช้งานผู้จัดการด้านความปลอดภัยหรือไม่ ในกรณีนี้คุณอาจต้องให้สิทธิ์
Michael-O

1
ขอบคุณปัญหาคือเซิร์ฟเวอร์ X กำลังทำงานในพอร์ตอื่น
Elteroooo

1
โปรแกรมของผู้ถามต้องการทำij.io.Opener.openJpegOrGifเราเดาได้ว่าอาจต้องใช้ GUI ดังนั้น headless จะทำให้เกิดข้อผิดพลาดอื่น: java.awt.HeadlessException.
Nicolas Raoul

41

ลบตัวแปร DISPLAY

unset DISPLAY

สิ่งนี้ช่วยได้ในกรณีส่วนใหญ่ (เช่นการเริ่มต้นแอ็พพลิเคชันเซิร์ฟเวอร์หรือเครื่องมือที่ใช้ java อื่น ๆ ) และหลีกเลี่ยงการแก้ไขบรรทัดคำสั่งทั้งหมดนั้น

นอกจากนี้ยังสามารถเพิ่มลงใน. bash_profile ได้อย่างสะดวกสบายสำหรับผู้ใช้แอปเซิร์ฟเวอร์ / เครื่องมือโดยเฉพาะ


1
มันไม่ได้ช่วยฉันเลย ฉันได้รับสิ่งนี้: AWT ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์หน้าต่าง X11 โดยใช้ ...
Pankaj Kumar Katiyar

หากแอปของคุณใช้ awt คุณต้องตั้งค่า DISPLAY ให้ถูกต้อง สำหรับแอปที่ไม่ใช้ awt
bebbo

เมื่อเล่นกับสิ่งนี้ตรวจสอบให้แน่ใจว่าคุณรีสตาร์ท mobaXterm หลังจากเพิ่มคำสั่ง unset ใน bashfile ของคุณ เนื่องจากตัวแปร Display จะถูกตั้งค่าจากก่อนหน้านี้และการเรียกใช้ไฟล์ bash ของคุณจะไม่เปลี่ยนแปลง
mrk

17

ฉันคิดว่าคุณกำลังทำงานในโหมด sudo โปรดชำระเงินไปที่โหมดผู้ใช้แล้วลองอีกครั้ง


4
นี่เป็นปัญหาของฉันเช่นกัน ดูเหมือนจะแปลกที่ไม่สามารถทำงานได้เหมือนรูทใช่มั้ย?
javajavajava

ทำไมฉันถึงใช้ sudo ไม่ได้?
Andrea Borgogelli Avveduti

@javajavajava yup
Harsh V Pillai

9

ในกรณีที่มีใครพยายามเรียกใช้การทดสอบหน่วยอัตโนมัติผ่าน maven-surefire-plugin บน CI (jenkins, .. ) และได้รับข้อผิดพลาดดังกล่าวข้างต้นโปรดอัปเดตการกำหนดค่าปลั๊กอิน surefire ของคุณ:

<plugin>
     <groupId>org.apache.maven.plugins</groupId>
     <artifactId>maven-surefire-plugin</artifactId>
     <version>${maven-surefire-plugin.version}</version>
     <configuration>
            <systemPropertyVariables>
                <java.awt.headless>true</java.awt.headless>
            </systemPropertyVariables>
      </configuration>
</plugin>

1
วิธีทำใน gradle และวิธีการตั้งค่าคุณสมบัติในนั้น
Sobhit Sharma

8

สิ่งนี้จะแก้ไขได้:

/usr/bin/java -Djava.awt.headless=true $Your_program

ไม่ได้ซ่อมของฉัน
Alex Shnyrov

1
สิ่งนี้ได้ผลสำหรับฉัน ขอบคุณ. ฉันได้รับข้อผิดพลาดเนื่องจากฉันใช้ poi
dev4life

6

สำหรับฉันเข้าสู่ระบบในฐานะ-Yแทนที่จะใช้ -X ทำงาน

ในกรณีที่คุณมี X11 ที่ไม่น่าเชื่อถือดังที่แสดงด้านล่างให้ลองแฟล็ก -Y แทน (หากคุณเชื่อถือโฮสต์):

คำเตือน : การตั้งค่าการส่งต่อ X11 ที่ไม่น่าเชื่อถือล้มเหลว: ไม่ได้สร้างข้อมูลคีย์ xauth


5

หลังจากหลายวันของความพยายามที่ไร้ประโยชน์ในการติดตั้ง glassfish บนราสเบอร์รี่ pi 2 ด้วยฟีดอร่า 22 แบบไม่มีหัวด้านล่างทำงานให้ฉันโดยไม่มีปัญหา

 unset DISPLAY
java -Djava.awt.headless=true -jar glassfissh-installer-v2ur2-b04-linux.jar

ขอความช่วยเหลือจากที่นี่


4

ขั้นแรก: เริ่ม XQuartz

ประการที่สอง: ssh -X user @ ip_address

... : เริ่มกระบวนการของคุณ

ถ้าคุณ ssh แล้วเริ่ม XQuartz คุณจะได้รับข้อผิดพลาดนั้น


4

สิ่งนี้ช่วยแก้ปัญหาของฉันได้

xhost +

แต่โปรดทราบว่าxhost +ปิดใช้งานการรับรองความถูกต้องโดยสมบูรณ์และอนุญาตให้ทุกคนเข้าถึงแอปพลิเคชันทั้งหมดบนหน้าจอของคุณ

xhost +si:localuser:root ดูเหมือนจะทำงานคล้ายกับการตรวจสอบสิทธิ์ที่เหมาะสม


3

ก่อนอื่นให้ทำสิ่งนี้ใน Build Phase ของ Jenkins หากใช้หรือตั้งค่าใน / etc / profile:

unset DISPLAY
export DISPLAY=:0

จากนั้นตั้งค่าคุณสมบัตินี้ในโค้ด java หรือใช้ maven: -Djava.awt.headless = false


2

ฉันใช้ Xming และพบข้อผิดพลาดที่คล้ายกัน ทำตามขั้นตอนต่อไปนี้เพื่อแก้ไขปัญหา:

  1. ในการเปิดตัว Xming ให้เลือกช่องไม่มีการควบคุมการเข้าถึง
  2. ในผงสำหรับอุดรูให้รันคำสั่งต่อไปนี้: DISPLAY=XXX.XXX.XXX.XX:0.0; export DISPLAY

แทนที่XXX.XXX.XXX.XXด้วยที่อยู่ IP ของคุณ


ฉันอยู่ในการกำหนดค่าเดียวกัน แต่มันใช้ไม่ได้ ฉันต้องการเพิ่ม IP ที่เรียกใช้ X11 ในไฟล์ X0.hosts
Christophe Moine

2

แก้ไขแล้ว. ฉันเพิ่งออกจากระบบและเข้าสู่ระบบด้วย xorg!


1
ส่งออก DISPLAY =: 0 หรือส่งออก DISPLAY =: 1 ไม่ได้ผลสำหรับฉัน การออกจากระบบและการเข้าสู่ระบบช่วยแก้ปัญหาให้ฉันได้
Optimus

2

หากคุณพยายามส่งออกการแสดงผลโดยใช้ su และยังไม่ได้ผล นี่คือสิ่งที่ได้ผลสำหรับฉัน ลองส่งต่อ X11 สำหรับผู้ใช้ sudo

เชื่อมต่อโฮสต์ระยะไกลโดยใช้อ็อพชัน -X กับ ssh

# ssh -X root@remote-host

ตอนนี้แสดงรายการ coockie ที่ตั้งไว้สำหรับผู้ใช้ปัจจุบัน

# xauth list $DISPLAY
    node01.thegeekdiary.com/unix:10  MIT-MAGIC-COOKIE-1  dacbc5765ec54a1d7115a172147866aa
# echo $DSIPLAY
    localhost:10.0

เปลี่ยนไปใช้บัญชีผู้ใช้อื่นโดยใช้ sudo เพิ่มคุกกี้จากผลลัพธ์คำสั่งด้านบนไปยังผู้ใช้ sudo

# sudo su - [user]
# xauth add node01.thegeekdiary.com/unix:10  MIT-MAGIC-COOKIE-1  dacbc5765ec54a1d7115a172147866aa

ส่งออกการแสดงผลจากขั้นตอนที่ 2 อีกครั้งสำหรับผู้ใช้ sudo ลองใช้คำสั่ง xclock เพื่อตรวจสอบว่าแอ็พพลิเคชันไคลเอนต์ x ทำงานตามที่คาดไว้หรือไม่

# export DISPLAY=localhost:10.0

แหล่งที่มา: https://www.thegeekdiary.com/how-to-set-x11-forwarding-export-remote-display-for-users-who-switch-accounts-using-sudo/


1

หากคุณเห็นข้อผิดพลาดนี้ใน Hudson ให้ลองลบไดเร็กทอรี. java ออกจากโฮมไดเร็กทอรีของคุณอาจได้ผลสำหรับคุณ


1

Michael-O ให้แนวทางที่เป็นประโยชน์ในการแก้ปัญหา อีกวิธีหนึ่งในการแก้ปัญหานี้คือการเริ่มต้นเซิร์ฟเวอร์ด้วย Putty Console


คุณช่วยอธิบายเพิ่มเติมอีกหน่อยได้ไหมว่าวิธีนี้ได้ผล (ฉันไม่เคยใช้สีโป๊ว)
mrk

1

ในกรณีของฉันไม่มีพื้นที่เหลือในเครื่องและฉันก็ประสบปัญหาเดียวกัน บางครั้งอาจเป็นปัญหาเรื่องพื้นที่ ตรวจสอบพื้นที่ในสภาพแวดล้อม Linux / Unix ของคุณและตรวจสอบให้แน่ใจว่าเครื่องของคุณมีพื้นที่เพียงพอ


1

ตรวจสอบว่ามีการตั้งค่าตัวแปร $ DISPLAY หรือไม่โดยใช้คำสั่งด้านล่าง:

echo $ DISPLAY

หากไม่ได้ตั้งค่าตัวแปรการแสดงผลให้เรียกใช้คำสั่งด้านล่างเพื่อตั้งค่า (แม้ว่าจะถูกตั้งค่าไว้คุณสามารถมีค่าหนึ่งสำหรับเซสชันของคุณได้

ส่งออก DISPLAY =: 0.0

ในผงสำหรับอุดรูยังมีตำแหน่งแสดง x เป็น: 0.0


1

ฉันมีปัญหาเดียวกันกับเซิร์ฟเวอร์ Linux ที่ฉันกำลังทำงานอยู่ การเชื่อมต่อ java กับจอแสดงผล X11 ทำงานบนโหนดส่วนหัว แต่จะไม่ทำงานบนโหนดอื่น หลังจากติดต่อผู้ดูแลระบบพบว่าเวอร์ชันปัจจุบันของระบบการจัดตารางงาน (SLURM) ของเราไม่รองรับการส่งต่อ X11 พวกเขาต้องอัปเดต SLURM (SLURM เวอร์ชันใหม่กว่ารองรับ) เพื่อให้ทำงานได้



0

ฉันพบข้อผิดพลาดเดียวกันกับคุณเมื่อฉันรันคำสั่ง jconsole ที่รีโมต ฉันต้องการแก้ไขพารามิเตอร์ที่ jconsole ที่รันบนโฮสต์ Linux ระยะไกลฉันสามารถล็อกอินโฮสต์โดยใช้ secureCRT เทอร์มินัลส่งข้อมูลข้อผิดพลาดนี้ โชคดีที่เวลาใช้สีโป๊วมันโอเค แปลก....


0

หากคุณเริ่มแอปพลิเคชันบนเซิร์ฟเวอร์ระยะไกลในขณะที่ล็อกอินโดย ssh อีกวิธีหนึ่งคือเริ่ม ssh ด้วย-xพารามิเตอร์หรือเพิ่มForwardX11 noใน/etc/ssh/ssh_configไฟล์. ในกรณีนี้ ssh จะไม่สร้างตัวแปรสภาพแวดล้อม DISPLAY


0

สำหรับฉันปัญหาคือxorg-x11-xauthไม่ได้ติดตั้ง ฉันติดตั้งแล้วมันใช้งานได้

แพ็คเกจที่ฉันมีตอนนี้คือ:

  • libX11-common-1.6.3-2.el6.noarch
  • libX11-1.6.3-2.el6.i686
  • libX11-1.6.3-2.el6.x86_64
  • xorg-x11-drv-ati-firware-7.6.1-2.el6.noarch
  • xorg-x11-xauth-1.0.9-1.el6.x86_64

0

หากคุณกำลังเรียกใช้รหัสของคุณจาก Jenkins การเปิดใช้งานตัวเลือก "เริ่ม Xvfb ก่อนสร้างและปิดหลังจากนั้น" อาจช่วยได้ มันช่วยฉัน




0

สำหรับ Ubuntu 17.10 ติดตั้ง X virtual frame buffer (xvfb)

apt install xvfb

และเพิ่มบรรทัดเหล่านี้ในไฟล์ / etc / profile ...

# Start the X virtual frame buffer (Xvfb)
if [ -f /usr/X11R6/bin/Xvfb ]; then
/usr/X11R6/bin/Xvfb :1 -screen 0 1366x768x32
fi

# Set the DISPLAY variable for the X virtual frame buffer (Xvfb)
export DISPLAY=localhost:1.0

2
ตอนนี้ฉันเพิ่งได้รับ "Exception in thread" main "java.awt.AWTError: ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์หน้าต่าง X11 โดยใช้ 'localhost: 1.0' เป็นค่าของตัวแปร DISPLAY" บน Ubuntu 16.04 ตอนนี้ไบนารี Xvfb ดูเหมือนจะอยู่ที่ / usr / bin ไม่ใช่ / usr / X11R6 / bin แต่ให้ฉัน "ไม่สามารถเพิ่มหน้าจอ 0 (EE)" ได้
Chris Jenks

0

ในกรณีของฉันข้อผิดพลาดนี้ไม่เกี่ยวข้องกับพอร์ต DISPLAY ฉันพยายามโหลด XML ใน Windchill (ซอฟต์แวร์ PLM) และได้รับเฉพาะข้อผิดพลาดข้างต้นบนเทอร์มินัล ในแฟ้มติดตามผมพบว่ารายงานที่XML ไฟล์ของฉันคือความเสียหาย อาจมีบางคนมีปัญหาคล้ายกันและสามารถใช้คำตอบนี้ได้


0

ปัญหาของฉันเกิดจากไฟร์วอลล์ ปิดการใช้งานชั่วคราว

[แก้ไข] และชื่อโฮสต์ของเซิร์ฟเวอร์ก็ชี้ไปที่ IP อื่น ตั้งค่าเป็นเซิร์ฟเวอร์ท้องถิ่น strace xclockช่วยแก้ปัญหานี้


0

ฉันได้แก้ไขปัญหานี้โดยการเข้าสู่ระบบโดยใช้ Xorg โดยค่าเริ่มต้นฉันใช้ Wayland ดูเหมือนว่า Wayland จะกำจัดข้อบกพร่องในการออกแบบส่วนใหญ่ของ Xorg ซึ่งมีปัญหาในตัวเองป้อนคำอธิบายภาพที่นี่

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