วิธีเพิ่มไลบรารีเนทีฟลงใน“ java.library.path” ด้วยการเปิดใช้ Eclipse (แทนที่จะแทนที่)


92

ผมได้รับห้องสมุดพื้นเมืองที่จะต้องมีการเพิ่มในjava.library.path ด้วยอาร์กิวเมนต์ JVM -Djava.library.path = path ...ฉันสามารถกำหนดเส้นทางได้ตามที่ฉันต้องการ

ปัญหาของฉันคือไลบรารีอื่นของฉัน (การรายงาน pentaho) ค้นหาฟอนต์ตามค่าเริ่มต้น java.library.path (รวมถึงไดเร็กทอรีระบบ ฯลฯ ) และการตั้งค่าด้วยตนเองจะแทนที่พา ธ เริ่มต้น ..

ดังนั้น: ฉันจะเพิ่มรายการพา ธ ไปยัง java.library.path เริ่มต้นได้อย่างไรแทนที่จะแทนที่มัน (ซึ่งดูเหมือนจะทำด้วย -Djava.library.path) (ฉันไม่ต้องการเพิ่มเส้นทางเริ่มต้นด้วยมือซึ่งจะไม่ดีสำหรับการนำไปใช้งาน)

แก้ไข: ขออภัยในรายละเอียดที่ขาดหายไป ฉันกำลังทำงานกับ Eclipse (การปรับใช้เสร็จสิ้นด้วย JNLP และที่นั่นฉันสามารถใช้ nativelibภายใต้ทรัพยากรได้ )


1
กรุณาดูคำตอบที่ยอมรับสำหรับคำถามนี้แทน - สำหรับฉันมันดีกว่ามาก: stackoverflow.com/questions/957700/…
laher

คำถาม "วิธีเพิ่มไลบรารีเนทีฟให้กับ .. " เป็นเรื่องที่น่าสับสน อาจเกี่ยวกับการเพิ่ม (ต่อท้ายหรือก่อนหน้า) "ไลบรารีพา ธ " อื่นกล่าวคือสมมติว่า Eclipse แสดงบางอย่างเช่น java.library.path = path1: path2: path3 ตามค่าเริ่มต้นคำถามคือวิธีเริ่ม Eclipse ที่ลงท้ายด้วย java.library .path = my / lib / folder: path1: path2: path3
whaefelinger

คำตอบ:


46

ลืมปัญหานี้ไปแล้ว ... ฉันถามกับ Eclipse จริง ๆ ขอโทษที่ไม่ได้ระบุว่าเดิม และคำตอบดูเหมือนจะง่ายเกินไป (อย่างน้อยก็คือ 3.5 อาจเป็นรุ่นเก่าด้วย):

อาร์กิวเมนต์ของคอนฟิกูเรชันการรัน Java: อาร์กิวเมนต์ VM:

-Djava.library.path="${workspace_loc:project}\lib;${env_var:PATH}"

ต้องอย่าลืมเครื่องหมายคำพูดมิฉะนั้นจะมีปัญหาเรื่องช่องว่างใน PATH


7
หากมีไลบรารีที่ใช้ร่วมกันสองไลบรารีโดยขึ้นอยู่กับไลบรารีอื่นจะไม่ทำงาน สิ่งแรกถูกพบโดยรันไทม์ของ Java แต่ตัวที่สองได้รับการแก้ไขโดยตัวโหลดไดนามิกของระบบ ทางออกเดียวที่ฉันพบคือตั้งค่า LD_LIBRARY_PATH
kevin cline

4
คำตอบที่ได้รับจาก @Touko ไม่ตรงกับคำถามเดิมซึ่งเกี่ยวกับการต่อท้ายหรือใส่โฟลเดอร์ไลบรารีดั้งเดิมไว้ล่วงหน้า อย่างน้อยใน Mac OS 10.8 ทั้ง $ PATH หรือ $ LD_LIBRARY_PATH และ $ {workspace_loc: project} \ lib ไม่ได้เกี่ยวข้องกับค่าเริ่มต้น ตัวอย่างเช่นบน Mac ของฉันค่าเริ่มต้นคือ $ HOME / Library / Java / Extensions: / Library / Java / Extensions: / Network / Library / Java / Extensions: / System / Library / Java / Extensions: / usr / lib / java :.
whaefelinger

หากคุณใช้ TestNG ใน Eclipse คุณจะต้องแก้ไขคอนฟิกูเรชันการรัน TestNG: - ในหน้าต่าง Run Configurations เลือกคอนฟิกูเรชัน TestNG เป้าหมายของคุณ - เลือกแท็บสภาพแวดล้อม - เพิ่มตัวแปรเส้นทางและกำหนดค่าให้กับเป้าหมายของคุณ - ปล่อยให้สลับ "ผนวกสภาพแวดล้อมเข้ากับสภาพแวดล้อมดั้งเดิม" ที่เป็นค่าเริ่มต้น
Philippe

ฉันขอตัวอย่างได้ไหม
basickarl

@kevincline คุณช่วยอธิบายได้ไหมว่าทำไมมันถึงใช้ไม่ได้ในกรณีนั้น? ฉันเพิ่งพบปัญหานั้นและฉันพยายามทำความเข้าใจว่ามีอะไรผิดปกติกับวิธีแก้ปัญหานี้
anula

14

หากคุณต้องการเพิ่มไลบรารีเนทีฟโดยไม่รบกวนjava.library.pathเวลาพัฒนาใน Eclipse (เพื่อหลีกเลี่ยงการรวมพา ธ สัมบูรณ์และต้องเพิ่มพารามิเตอร์ให้กับคอนฟิกูเรชันการเรียกใช้ของคุณ) คุณสามารถจัดหาพา ธ ไปยังตำแหน่งไลบรารีเนทีฟสำหรับ Jar แต่ละตัวในJava Build เส้นทางโต้ตอบภายใต้สถานที่ตั้งของห้องสมุดพื้นเมือง โปรดสังเกตว่าชื่อไฟล์ไลบรารีเนทีฟต้องตรงกับชื่อไฟล์ Jar ดูคำอธิบายโดยละเอียดนี้


3
-1. คุณสมมติว่าผู้ใช้ปลายทางเรียกใช้แอปพลิเคชันจาก IDE ซึ่งไม่น่าเป็นไปได้
finnw

@finnw ฉันเห็นประเด็นของคุณ ฉันพบคำถามที่กำลังมองหาวิธีการเพิ่มไลบรารีเนทีฟใน IDE ระหว่างการพัฒนาโดยไม่ลบล้างjava.library.pathและกลับมาหลังจากค้นหาวิธีแก้ปัญหาที่อื่น จะแก้ไขคำตอบของฉันเพื่อให้ชัดเจนขึ้น
Fabian Steeg

จริงๆแล้วฉันกำลังทำงานกับ Eclipse แม้ว่าฉันจะไม่ได้พูดถึงมันในคำถามก็ตาม
Touko

สิ่งนี้ใช้ไม่ได้ใน Eclipse (Luna) เวอร์ชันปัจจุบันเนื่องจากการตั้งค่าคุณสมบัติจะแทนที่ java.library.path เหมือนที่ผู้ใช้อธิบายว่าเป็นปัญหาในคำถาม
Alex N.

9

SWT ใส่ DLL ดั้งเดิมที่จำเป็นลงใน JAR ค้นหา "org.eclipse.swt.win32.win32.x86_3.4.1.v3449c.jar" เพื่อดูตัวอย่าง

DLL ต้องอยู่ในรูทของ JAR ต้องลงนาม JAR และ DLL จะต้องปรากฏพร้อมกับการตรวจสอบใน META-INF / MANIFEST.MF เพื่อให้ VM รับข้อมูล


2
ฉันจะทำกับ NetBeans ได้อย่างไร?
Maciek Sawicki

AFAIK, NetBeans ใช้ Ant ในการสร้างโครงการ อ่านเอกสารสำหรับ Ant วิธีสร้าง JAR ที่ลงชื่อและวิธีใส่สิ่งต่างๆเช่น DLL ลงในไฟล์ Manifest
Aaron Digulla

ฉันจะตั้งค่าให้เพิ่ม. dll ใน Eclipse ได้อย่างไร?
NoBugs

@NoBugs: ใน Eclipse โพสต์นี้ควรช่วย: eclipsezone.com/eclipse/forums/t49342.html
Aaron Digulla

@AaronDigulla คุณแนะนำว่าอาจติด DLL ด้วยวิธีนี้เสมอหรือไม่? ฉันคิดว่ามันค้นหาสิ่งที่ต้องการjava.library.pathเท่านั้น คุณแนะนำว่าให้ค้นหาเฉพาะรูทของjar?

4

ใน Windows เป็นดังนี้:

-Djava.library.path = "C: / MyLibPath;% PATH%"

% PATH% คือ -Djava.library.path เก่าของคุณ


ลองใช้แนวคิดนี้ แต่ผลลัพธ์เป็น java.library.path: D: \ Workspace \ myProject \ lib;% PATH%
Touko

คุณยังสามารถใช้ $ {system_property: java.library.path}
Rob Elsner

2
ค่าเริ่มต้นของ UNIX / Mac / GNU Linux คือ LD_LIBRARY_PATH PATH เป็นสิ่งที่ Windows
whaefelinger

2

คุณสามารถหลีกเลี่ยงสิ่งนี้ได้โดยเรียกSystem.load () โดยทางโปรแกรมเพื่อโหลดไลบรารีดั้งเดิมของคุณหรือไม่? วิธีนี้ (ไม่เหมือนSystem.loadLibrary () ) ช่วยให้คุณระบุพา ธ สัมบูรณ์


1
โปรดอธิบายอย่างละเอียดว่าคุณจะเรียก System.load () โดยใช้โปรแกรมอย่างไรเมื่อเรียกใช้ Eclipse?
whaefelinger

2

https://bugs.eclipse.org/bugs/show_bug.cgi?id=102239ระบุว่าไม่มีกลไกการทดแทนที่นำมาใช้ในตัวเรียกใช้งานของ Eclipse อย่างน้อยก็ไม่สามารถปล่อย Juno ได้

ดังนั้นจึงเป็นไปไม่ได้เลยที่จะต่อท้ายหรือต่อท้ายโฟลเดอร์ไลบรารีอื่นใน java.library.path เมื่อเรียกใช้ Eclipse โดยที่ไม่มีความรู้เกี่ยวกับการตั้งค่าเริ่มต้นมาก่อน

ฉันเขียนเกือบจะเป็นไปได้ที่จะปล่อยให้ Eclipse เริ่มทำงานถ่ายโอนเนื้อหาของ java.library.path และหยุด Eclipse ในคำสั่งเดียว ดัมพ์จะถูกแยกวิเคราะห์จากนั้นนำไปเป็นอินพุตสำหรับเรียกใช้ Eclipse นั่นคือ

#!/bin/bash
# get default value of java.library.path (somehow)
default_lib_path=$( start_dump_stop_eclipse_somehow )  

# now launch Eclipse
eclipse --launcher.appendVmargs \
         -vmargs \
         -Djava.library.path="/my/native/lib/folder:${default_lib_path}"

1

ในระบบ UNIX คุณสามารถผนวกเข้ากับตัวแปรสภาพแวดล้อม LD_LIBRARY_PATH บน Windows JVM จะตั้งค่าคุณสมบัติระบบ java.library.path เป็น PATH โดยอัตโนมัติ ดังนั้นหาก dll อยู่บน PATH ของคุณแสดงว่าคุณถูกตั้งค่า


ผู้เริ่มต้นชุดข้อความมีความเฉพาะเจาะจงมากเกี่ยวกับวิธี "ผนวก" โฟลเดอร์ไลบรารีเนทีฟที่สองคุณเห็นด้วยหรือไม่?
whaefelinger

@ user667073 ฉันเคยพูดเหมือนกัน ... ต่อท้ายเป็นคำถามผู้เริ่มต้นเธรดรู้วิธีโหลด lib ที่ใช้ร่วมกันเป็นอย่างอื่นแล้ว ;-)
Ustaman Sangat

STS 3.4.0 และ Mac OS 10.8: การตั้งค่าของ LD_LIBRARY_PATH ไม่มีผลกระทบใด ๆ กับ java.library.path ฉันทดสอบสิ่งนี้ด้วย Subclipse / JavaHL อันนี้ใช้ได้: STS --launcher.appendVmargs -vmargs -Djava.library.path = / opt / local / lib ในขณะที่ส่งออก LD_LIBRARY_PATH = / opt / local / lib; STS มีค่าเป็นลบ
whaefelinger

1

หน้าต่าง -> ค่ากำหนด -> Java-> ติดตั้ง JREs จากนั้นเลือก JRE (JDK) ปัจจุบันของคุณแล้วคลิกแก้ไข เติมอาร์กิวเมนต์ VM เริ่มต้น: -Djava.library.path = / usr / local / xuggler / lib เสร็จแล้ว!


1
คำตอบนี้ไม่มีประโยชน์เนื่องจากผู้เริ่มต้นชุดข้อความถามเฉพาะเกี่ยวกับ "วิธีเพิ่มไลบรารีเนทีฟ [.. ] แทนที่จะแทนที่ [.. ]" คำตอบนี้จะลบล้างการตั้งค่าเริ่มต้น
whaefelinger

1

โซลูชันที่ Rob Elsner นำเสนอในหนึ่งในความคิดเห็นด้านบนทำงานได้อย่างสมบูรณ์แบบ (OSX 10.9, Eclipse Kepler) เราต้องต่อท้ายเส้นทางเพิ่มเติมที่คั่นด้วย ":"

คุณยังสามารถใช้ $ {system_property: java.library.path} - Rob Elsner 22 พ.ย. 53 เวลา 23:01 น.


0

ชื่อไฟล์ไลบรารีเนทีฟต้องตรงกับชื่อไฟล์ Jar สิ่งนี้สำคัญมาก โปรดตรวจสอบให้แน่ใจว่าชื่อ jar และชื่อ dll เหมือนกัน นอกจากนี้โปรดดูโพสต์จาก Fabian Steeg My download for jawin มีชื่อต่างกันสำหรับ dll และ jar มันคือ jawin.jar และ jawin d .dll ให้สังเกต 'd' พิเศษในชื่อไฟล์ dll ฉันเปลี่ยนชื่อเป็น jawin.dll และตั้งเป็นไลบรารีดั้งเดิมใน eclipse ตามที่กล่าวไว้ในโพสต์ " http://www.eclipsezone.com/eclipse/forums/t49342.html "


คำถามเกี่ยวกับการเพิ่มไลบรารีดั้งเดิม (โฟลเดอร์) ในการเรียกใช้ Eclipse
whaefelinger

0

ด้วยเหตุผลบางอย่างฉันไม่สามารถใช้งานหลายโฟลเดอร์ได้ (ทำได้ดีมาระยะหนึ่งแล้ว แต่ทันทีที่ฉันต้องการ dll เพิ่มเติมและเพิ่มโฟลเดอร์เพิ่มเติมไม่มีช่องว่างสีขาวในเส้นทาง) จากนั้นฉันคัดลอก dll ที่จำเป็นทั้งหมดไปยังโฟลเดอร์เดียวและมีสิ่งนั้นเป็นjava.library.pathของฉันและมันก็ใช้งานได้ ฉันไม่มีคำอธิบาย - ถ้าใครทำก็คงจะดีมาก


ถ้าพบไลบรารีเนทีฟผ่าน java.library.path และคุณคัดลอกอีกอันลงในโฟลเดอร์นั้นดูเหมือนว่าจะพบไลบรารีที่สองด้วยใช่ไหม
whaefelinger

แน่นอนว่าทำไมฉันถึงใช้แบบนั้นดูสิ! สิ่งที่ฉันสงสัยคือสามารถเพิ่มหลายโฟลเดอร์โดยไม่ต้องย้ายหรือเชื่อมโยงเนื้อหาไปรอบ ๆ ได้หรือไม่
Ustaman Sangat

0

คำตอบที่มีอยู่จำนวนมากสมมติว่าคุณต้องการตั้งค่านี้สำหรับโปรเจ็กต์เฉพาะ แต่ฉันจำเป็นต้องตั้งค่าสำหรับ Eclipse เองเพื่อสนับสนุนการพิสูจน์ตัวตนแบบรวมสำหรับไดรเวอร์ SQL Server JDBC

ในการทำเช่นนี้ฉันทำตามคำแนะนำเหล่านี้เพื่อเรียกใช้ Eclipse จากบรรทัดคำสั่ง Java แทนตัวเรียกใช้งานปกติ จากนั้นฉันเพิ่งแก้ไขสคริปต์นั้นเพื่อเพิ่มอาร์กิวเมนต์ -Djava.library.path ของฉันในบรรทัดคำสั่ง Java


0
  1. บน Windows: เพิ่มเส้นทางไปยังไลบรารีไปยังตัวแปรสภาพแวดล้อม PATH
  2. บน Linux: เพิ่มพา ธ ไปยังไลบรารีไปยังตัวแปรสภาวะแวดล้อม LD_LIBRARY_PATH
  3. บน Mac: เพิ่มเส้นทางไปยังไลบรารีไปยังตัวแปรสภาพแวดล้อม DYLD_LIBRARY_PATH

java.library.path เริ่มต้นด้วยค่าของตัวแปรด้านบนบนแพลตฟอร์มที่เกี่ยวข้อง

สิ่งนี้ควรใช้ได้กับ IDE ใด ๆ

คุณสามารถทดสอบว่าค่านี้เป็นตามที่คุณคาดหวังหรือไม่โดยการโทร java -XshowSettings:properties


-2

ใน Windows ฉันพบว่าสิ่งที่สำคัญคือการเริ่ม Eclipse จากบรรทัดคำสั่งแทนที่จะเริ่มจากเมนูเริ่มหรือทางลัดโดยที่ DLL ดั้งเดิมอยู่ในไดเร็กทอรีใน PATH ของคุณ เห็นได้ชัดว่าสิ่งนี้ทำให้มั่นใจได้ว่าไดเร็กทอรีที่เหมาะสมอยู่บนเส้นทาง


แก้ไขฉันถ้าฉันผิด แต่ฉันเชื่อว่าไดเร็กทอรีการทำงานปัจจุบันบน Windows จะรวมอยู่โดยอัตโนมัติเมื่อค้นหา DLL (หรือไบนารีที่ปฏิบัติการได้) ดังนั้นเมื่อคุณเปลี่ยนเข้าไปในโฟลเดอร์ที่ DLL อยู่และเริ่มจากนั้น Eclipse ขึ้นใช่แล้ว DLL ที่คุณกำลังมองหาจะพบ นอกเหนือจากนั้นคำตอบนี้เกี่ยวข้องกับคำถามเริ่มต้นของเธรดอย่างไร?
whaefelinger
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.