วิธีตั้งค่าตัวแปร CLASSPATH สำหรับโฟลเดอร์ใน Ubuntu


16

ฉันรู้ว่าexport CLASSPATH=/usr/local/java/tools.jar:$CLASSPATHจะเพิ่ม tools.jar ไปยัง CLASSPATH แต่ฉันต้องการตั้งค่าโฟลเดอร์เป็น CLASSPATH

แบบนี้

export CLASSPATH=/usr/local/java/lib/:$CLASSPATH

แต่มันไม่ทำงาน

คำตอบ:


11

อันดับแรกโดยทั่วไปการตั้งค่า env var CLASSPATHมักทำให้เกิดปัญหามากกว่าที่จะแก้ปัญหา - เนื่องจากแอปไม่ต้องการ / ต้องการ classpath เดียวกันทั้งหมดและมักจะแตกเมื่อมีขวดที่ไม่ต้องการหรือแม้แต่ขวดที่ไม่ต้องการรวมอยู่ใน classpath แอพพลิเคชั่นจาวาควรรวมจำนวนขั้นต่ำของไหที่ต้องการไม่มากไม่น้อย

เมื่อคุณมีเฉพาะปพลิเคชันของแต่ละบุคคลที่จะต้องว่า classpath java -cp path1:path2:...จะตั้งแล้วมักจะมีตัวเลือกบรรทัดคำสั่งเป็นที่ต้องการ: ไอคอนเดสก์ท็อปสามารถเปลี่ยนคำสั่งเพื่อรวมตัวเลือกเหล่านี้หรือเชลล์สคริปต์สามารถแก้ไขเพื่อรวมตัวเลือกเหล่านี้

ที่ถูกกล่าว (และเนื่องจากมีข้อยกเว้นเสมอกฎ) จากนั้นขึ้นอยู่กับรุ่นของจาวา (requres java 6 หรือใหม่กว่านี้) คุณสามารถระบุว่าจะเพิ่มไดเรกทอรีทั้งหมดของขวดลงใน classpath โดยเพิ่ม " *" ในตอนท้ายของไดเรกทอรี; เช่น, ต่อไปนี้:

 /dir1/foo.jar:/dir2/dir3:/dir5/dir6/*:etc...

หมายถึง:

  • /dir1/foo.jar - (โถเดียว) จะถูกเพิ่มไปยัง classpath;
  • /dir2/dir3- คลาส un-jar'd ทั้งหมดในไดเรกทอรีนี้จะถูกเพิ่มใน classpath (ต้องอยู่ในโครงสร้างแพ็คเกจที่เหมาะสมเช่นcom.my.Foo.classต้องอยู่ใน/dir2/dir3/com/my/Foo.class)
  • /dir5/dir6/*- ขวดทั้งหมดในไดเรกทอรีนี้ (เช่น, /dir5/dir6/*.jar) จะถูกเพิ่มใน classpath โปรดทราบว่า " *" ไม่ใช่สัญลักษณ์แทน (คุณไม่สามารถใช้f*.jarหรือแม้กระทั่ง*.jar); เป็นอักขระพิเศษที่ระบุว่า "เพิ่มขวดทั้งหมด"

โดยทั่วไปหากคุณต้องเพิ่มไดเรกทอรีทั้งหมดของขวดลงใน classpath ของแอปพลิเคชันแอปนั้นไม่ได้รับการรวมอย่างถูกต้อง ค่อนข้างแอปควรมีรายการที่มีรายการขวดขึ้นอยู่กับ หรืออย่างน้อยที่สุดขวดเดียวเท่านั้นที่ควรเพิ่มใน classpath ของคุณและขวดนั้นสามารถมีรายการทั้งหมดของไหในรายการย่อยบางรายการ


ฉันใช้เวลามากกว่า 5 ชั่วโมงเพื่อหาสิ่งนี้ใน Ubuntu 12.04 หลังจากที่คุณคอมไพล์ไฟล์และรันคลาสสิ่งสองสิ่งนั้นมีความสำคัญ 1. ไม่ว่าคุณจะใช้แพ็คเกจในชั้นเรียนของคุณ และคุณต้องใช้ "java -cp. className" ในโฟลเดอร์หลักของแพ็คเกจ 2. คุณต้องใช้ ".:" like "java -cp.: / usr / lib / jvm / java-1.6.0-openjdk-i386 / jre / lib / *: / dir2 / jarlib / *"
zhihong

@zhihong คุณควรพิจารณาใช้ IDE เช่น netbeans ปล่อยให้มันเลื่อนไปที่ build build ที่ใช้อยู่ซึ่งกำหนดค่า classpath ของคุณ ใน Netbeans ให้ตั้งค่าโครงการใหม่โดยใช้ maven หรือ gradle (หรือ ant - แต่สิ่งนี้ซับซ้อนเกินไปเมื่อต้องรับมือกับการพึ่งพา (ดูเพิ่มเติมที่: ภารกิจ maven ant ซึ่งฉันชอบมากกว่า ivy) Gradle ปัจจุบันเป็น 'ร้อน' สิ่ง fwiw; คุณควรจะลองดู นอกจากนี้ (1) คุณควรใช้ชื่อแพ็คเกจเสมอ และ (2) ไม่จำเป็นต้องมีคลาสในไดเร็กทอรี jvm ใน classpath; พวกเขาอยู่ใน classpath "boot" แล้ว
ไมเคิล

ขอบคุณสำหรับคำแนะนำของคุณ ที่จริงแล้วฉันใช้ eclipse และรหัสทำงานอย่างถูกต้องที่นั่น แต่เมื่อฉันเรียกใช้ใน terminal แล้วได้รับ "ClassNotFoundException" ฉันพยายามเพิ่ม lib / jar ภายนอกหลายวิธี แต่ทั้งหมดล้มเหลว สุดท้ายจะทำงานโดยรวมไดเร็กทอรี jvm และ lib / jar ภายนอกในบรรทัดคำสั่งด้วย แต่ฉันลองวันนี้คุณถูกต้องแล้วไม่จำเป็นต้องใช้ไดเรกทอรี jvm
zhihong

2

ถ้าคุณต้องการตั้ง classpath อย่างถาวรแล้ว 1) หาที่ติดตั้ง java .. คุณอาจใช้ "whereis java" openjdk-7/6 อยู่ใน / usr / lib / jvm / .....

2) เราจำเป็นต้องตั้งค่า CLASSPATH ใน / etc / environment

  sudo gedit /etc/environment

3) เพิ่มไลค์ต่อไปนี้ .. (อย่าปล่อยให้เว้นวรรคใด ๆ ในขณะที่พิมพ์) (ปรับแต่งตามเวอร์ชั่นจาวาและการติดตั้งของคุณ) (พา ธ โฮมนี้ใช้สำหรับ open jdk 7)

   JAVA_HOME="/usr/lib/jvm/java-7-openjdk-i386/bin"

   export JAVA_HOME

   CLASSPATH=".:/usr/lib/jvm/java-7-openjdk-i386/lib:/home/laptop/Desktop/a2"

   export CLASSPATH

ไดเรกทอรีแยกโดย ":"


ทำไมทุกคนจึงเพิ่ม "{JAVA_HOME} / lib" ใน classpath ของพวกเขา ไม่จำเป็นหรือเป็นความคิดที่ดี สำหรับเรื่องนั้นการตั้งค่า env CLASSPATH นั้นเป็นความคิดที่ไม่ดีเว้นแต่ว่าจะอยู่ในเชลล์สคริปต์สำหรับสคริปต์นั้นในกรณีนี้ตัวเลือกบรรทัดคำสั่ง "-cp" ถึง java จะยังคงดีกว่า
ไมเคิล

0

เปิดเทอร์มินัลและประเภท

sudo nano ~ / .bashrc

เพิ่มการส่งออกทั้งหมดที่คุณต้องการ ...

ส่งออก JAVA_HOME = / usr / local / java / jdk1.6.0_06 (เส้นทางของคุณ)

ส่งออก ANT_HOME = / opt / ant / apache-ant-1.9.4

ในที่สุดรีสตาร์ท terminal เพื่อให้การเปลี่ยนแปลงมีผล

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