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.