ความแตกต่างระหว่าง Class Path และ Build Path คืออะไร


86

ฉันสับสนกับสองคำนี้

ฉันควรทำอย่างไรเพื่อสร้างไฟล์ภายใต้โฟลเดอร์ src ของ Spring MVC Project เมื่อฉันสร้างโดยใช้วัตถุไฟล์มันจะสร้างไฟล์ภายใน C: \ SpringSourceTool ... ฉันเดาว่านี่คือ ClassPath ใช่ไหม

ฉันจะรับapplicationcontextโฟลเดอร์หรือรูทของแอปพลิเคชันได้อย่างไร?

คำตอบ:


101

สร้างเส้นทางถูกนำมาใช้สำหรับการสร้างแอพลิเคชันของคุณ ประกอบด้วยไฟล์ต้นฉบับทั้งหมดของคุณและไลบรารี Java ทั้งหมดที่จำเป็นในการคอมไพล์แอปพลิเคชัน

classpathถูกนำมาใช้สำหรับการรันแอพลิเคชัน ซึ่งรวมถึงคลาสและไลบรารี java ทั้งหมดที่จำเป็นในการรันแอ็พพลิเคชัน java Classpath จำเป็นต้องมีพา ธ เริ่มต้น.ซึ่งจะใช้หากเครื่องเสมือน java ไม่พบเส้นทางที่ผู้ใช้กำหนด ( CLASSPATHตัวแปรสภาพแวดล้อม-cpแฟล็กหรือClass-Path:แอตทริบิวต์ในรายการ jar)


แต่ javac ใช้อาร์กิวเมนต์ classpath อาจกล่าวได้ว่าพารามิเตอร์นี้ "โอเวอร์โหลด" ในการระบุเส้นทางการสร้าง
aioobe

4
ไม่อาร์กิวเมนต์classpathเป็นคำแนะนำสำหรับคอมไพเลอร์ว่าเขาควรคาดหวังว่าจะพร้อมใช้งาน / ให้ที่รันไทม์เนื่องจากคุณไม่ได้สร้างทุกคลาสที่คุณใช้เอง (เช่น JFC, Libraries, ... ) buildpathมีทั้งแหล่งที่มาและ / หรือแหล่งที่มา / อ้างอิงรวบรวมและสถานที่ที่จะมองหาพวกเขา
Johannes Wachter

ในขณะที่พัฒนาปลั๊กอินฉันได้เพิ่มไลบรารีที่จำเป็นทั้งหมดลงใน classpath แต่ไม่สามารถนำเข้าอะไรได้เลย Eclipse ไม่เห็นพวกมันจนกว่าฉันจะเพิ่มมันเพื่อสร้างเส้นทาง
Bax

51

classpath เป็นวิธีธรรมดาในการบอกคอมไพเลอร์ Java (มาตรฐาน) และรันไทม์ Java ว่าจะค้นหาคลาสที่คอมไพล์ได้ที่ไหน โดยทั่วไปจะเป็นลำดับของชื่อไฟล์ JAR และชื่อไดเร็กทอรี คลาสพา ธ ที่คอมไพเลอร์และระบบรันไทม์ใช้ไม่จำเป็นต้องเหมือนกัน แต่โดยทั่วไปแล้วควรเป็นโดยเฉพาะอย่างยิ่งสำหรับโปรเจ็กต์ขนาดเล็ก

Buildpath ไม่ใช่คำศัพท์ Java มาตรฐาน เป็นคำศัพท์สำหรับวิธีที่สมบูรณ์ยิ่งขึ้นซึ่ง IDE ทั่วไประบุความสัมพันธ์ระหว่าง "โครงการ" ที่ประกอบขึ้นเป็นแอปพลิเคชัน IDE ใช้สิ่งนี้เพื่อหา classpath และ sourcepath สำหรับการคอมไพล์โค้ด Java และ classpath สำหรับรัน IDE ยังใช้เส้นทางการสร้างเพื่อค้นหาวิธีการทำแพ็กเกจโค้ดของคุณและการอ้างอิงเป็นไฟล์ WAR (ตัวอย่าง)

ตัวอย่างเช่นพา ธ การสร้าง Eclipse สำหรับโปรเจ็กต์รวมโปรเจ็กต์อื่น ๆ ที่ขึ้นอยู่และแสดงรายการ JAR ไลบรารีเพิ่มเติมที่โปรเจ็กต์มี / อาศัยอยู่ นอกจากนี้ยังแสดงรายการแพ็คเกจในโครงการปัจจุบันที่โครงการปลายน้ำสามารถขึ้นอยู่ได้

(หากคุณกำลังใช้ Maven สำหรับโปรเจ็กต์ของคุณกลไก IDE buildpath จะรองจากการอ้างอิงที่ประกาศในไฟล์ POM ตัวอย่างเช่นการใช้ Eclipse กับ m2eclipse buildpath จะถูกสังเคราะห์จากไฟล์ POM)


27

พา ธ คลาสถูกใช้ที่รันไทม์เพื่อโหลดคลาสและรีซอร์สที่คอมไพล์

เส้นทางการสร้างถูกใช้ในเวลาคอมไพล์เพื่อค้นหาการอ้างอิงที่จำเป็นในการสร้างโครงการของคุณ


คุณบอกได้ไหมว่าคลาสพา ธ ใช้เพื่อค้นหา.classไฟล์ (และรีซอร์สที่คอมไพล์อื่น ๆ ) ในขณะที่ build path ใช้เพื่อค้นหาไฟล์ต้นทางที่ต้องคอมไพล์
Adam

1
@Adam ฉันไม่คิดว่านั่นจะเป็นความจริงอย่างสมบูรณ์ เส้นทางการสร้างต้องการไฟล์. class เพื่อคอมไพล์ไฟล์ต้นฉบับในบางครั้ง ดังนั้นเส้นทางการสร้างจึงใช้เส้นทางของคลาสที่อยู่เบื้องหลังเช่นกัน หากคุณใช้เวลาในการคอมไพล์และรันโปรเจ็กต์ java โดยใช้ java CLI คุณจะเห็นสิ่งนี้ ทั้ง javac และคำสั่ง java มีตัวเลือก classpath เนื่องจากทั้งคู่อาจจำเป็นต้องใช้
intrepistar_88

4

โปรเจ็กต์ Java แต่ละโปรเจ็กต์มีพา ธ การสร้างของตัวเองซึ่งระบุการอ้างอิงทั้งหมดที่จำเป็นในการคอมไพล์โปรเจ็กต์ การอ้างอิงเหล่านี้อาจมาจากโปรเจ็กต์ Java อื่นในเวิร์กสเปซจากไฟล์ Java archive. jar หรือจากโฟลเดอร์ที่มีไฟล์. class

ในสภาพแวดล้อม CLASSPATH คุณต้องระบุเฉพาะไฟล์. class (เช่น jar, zip files - ภายใน jar, ไฟล์ zip คุณจะพบเฉพาะคลาส java) นั่นคือคุณกำลังช่วย Java Virtual Machine (JVM) เพื่อค้นหาไฟล์คลาส Java

ฉันควรทำอย่างไรเพื่อสร้างไฟล์ภายใต้โฟลเดอร์ src ของ Spring MVC Project เมื่อฉันสร้างโดยใช้วัตถุไฟล์มันจะสร้างไฟล์ภายใน C: \ SpringSourceTool ...

นี่คือจุดเริ่มต้นของ JVM หากคุณต้องการสร้างไฟล์ที่อื่นให้ใช้เส้นทางสัมพัทธ์จากที่นี่

ดูสิ่งนี้และสิ่งนี้สำหรับข้อมูลเพิ่มเติม


คุณไม่ได้พูดถึง build path ในคำตอบของคุณ
aioobe

4

ฉันต้องการเพิ่มคำตอบของ Andreas_D เพื่ออธิบายว่าIDE / คอมไพเลอร์ต้องการพา ธ การสร้างเพื่อค้นหาแพ็กเกจและคลาสภายนอกที่โค้ดของคุณใช้ บางครั้งเราเรียกเหล่านี้เป็น'อ้างอิง'

หมายเหตุ: แพคเกจภายนอกเหล่านี้อาจได้รับการบรรจุในไฟล์บีบอัดขวดหรืออันที่จริงอาจจะมีไฟล์ jar หลายแพคเกจภายใน'ห้องสมุด' ห้องสมุดหรือกลุ่มของห้องสมุดมักจะทำขึ้น'กรอบ'

หากรหัสของคุณต้องการรหัสที่เขียนโดยผู้อื่นคุณสามารถนำเข้าสู่ชั้นเรียนของคุณโดยใช้importคำสั่ง อย่างไรก็ตามคำสั่งนี้เองไม่เพียงพอเนื่องจากคอมไพลเลอร์หรือ IDE จำเป็นต้องทราบว่าคลาสเหล่านั้นอยู่ที่ใด คุณสามารถระบุได้ในการสร้างเส้นทาง

classpathในมืออื่น ๆ บอก JVM ที่ใช้แอพลิเคชันของคุณที่จะหาการอ้างอิงใด ๆ ในระหว่างการดำเนินการที่เกิดขึ้นจริงของรหัสของคุณ

หมายเหตุนอกจากนี้: Classpath ใช้สำหรับ JVM

Buildpath ใช้สำหรับ IDE / คอมไพเลอร์และเป็นวิธีการสร้าง classpath จากสภาพแวดล้อมการพัฒนาของคุณ เมื่อคุณกำหนดค่า buildpath ของคุณผ่าน IDE คุณกำลังกำหนดค่าไฟล์ที่ซ่อนอยู่ในโปรเจ็กต์ของคุณที่เรียกว่า. classpath สิ่งนี้ใช้เพื่อจัดเตรียม classpath ให้กับ JVM ในการปรับใช้


1

Classpath ( จาก Wikipedia ):

เช่นเดียวกับพฤติกรรมการโหลดแบบไดนามิกแบบคลาสสิกเมื่อเรียกใช้โปรแกรม Java Java Virtual Machine จะค้นหาและโหลดคลาสอย่างเฉื่อยชา (โหลด bytecode ของคลาสเฉพาะเมื่อใช้คลาสเป็นครั้งแรกเท่านั้น) classpath บอก Java ว่าจะค้นหาในระบบไฟล์สำหรับไฟล์ที่กำหนดคลาสเหล่านี้ได้ที่ไหน

เครื่องเสมือนจะค้นหาและโหลดคลาสตามลำดับนี้:

คลาส bootstrap: คลาสที่เป็นพื้นฐานของแพลตฟอร์ม Java (ประกอบด้วยคลาสสาธารณะของ Java Class Library และคลาสส่วนตัวที่จำเป็นสำหรับไลบรารีนี้เพื่อให้ทำงานได้)

คลาสส่วนขยาย: แพ็คเกจที่อยู่ในไดเร็กทอรีส่วนขยายของ JRE หรือ JDK

jre / lib / ext / แพ็คเกจและไลบรารีที่ผู้ใช้กำหนด

โดยค่าเริ่มต้นจะมีเพียงแพ็กเกจของ JDK มาตรฐาน API และแพ็กเกจส่วนขยายเท่านั้นที่สามารถเข้าถึงได้โดยไม่จำเป็นต้องตั้งค่าว่าจะค้นหาจากที่ใด ต้องตั้งค่าพา ธ สำหรับแพ็กเกจและไลบรารีที่ผู้ใช้กำหนดเองทั้งหมดในบรรทัดคำสั่ง (หรือใน Manifest ที่เชื่อมโยงกับไฟล์ Jar ที่มีคลาส)

พูดง่ายๆก็คือในขณะที่โปรแกรมของคุณกำลังทำงาน JVM จะโหลดคลาสเท่าที่จำเป็นเท่านั้น เมื่อต้องการคลาส JVM จะขึ้นอยู่กับ classpath เพื่อให้ทราบว่าจะโหลด bytecode จากที่ใด (เช่น.classไฟล์)

ในทางกลับกันสร้างพา ธโดยทั่วไปจะใช้โดย IDE เช่น Eclipse เพื่อทราบตำแหน่งที่จะค้นหาไลบรารีเพิ่มเติมที่จำเป็นในการคอมไพล์ซอร์สโค้ดของโปรเจ็กต์ ไม่ได้ใช้เส้นทางการสร้างระหว่างรันไทม์

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