Apa itu classpath dan bagaimana cara mengaturnya?

324

Saya baru saja membaca baris ini:

Hal pertama yang dilakukan oleh format () adalah memuat templat Velocity dari classpath bernama output.vm

Tolong jelaskan apa yang dimaksud dengan classpath dalam konteks ini, dan bagaimana saya harus mengatur classpath.

Blankman
sumber

Jawaban:

530

Saat memprogram di Java, Anda membuat kelas lain tersedia untuk kelas yang Anda tulis dengan meletakkan sesuatu seperti ini di bagian atas file sumber Anda:

import org.javaguy.coolframework.MyClass;

Atau terkadang Anda 'mengimpor massal' dengan mengatakan:

import org.javaguy.coolframework.*;

Jadi nanti dalam program Anda ketika Anda mengatakan:

MyClass mine = new MyClass();

Java Virtual Machine akan tahu di mana menemukan kelas terkompilasi Anda.

Akan tidak praktis untuk melihat VM melalui setiap folder di komputer Anda, jadi Anda harus memberikan VM daftar tempat untuk dilihat. Ini dilakukan dengan meletakkan file folder dan jar di classpath Anda.

Sebelum kita berbicara tentang bagaimana classpath diatur, mari kita bicara tentang file .class, paket, dan file .jar.

Pertama, anggap saja MyClass adalah sesuatu yang Anda buat sebagai bagian dari proyek Anda, dan itu ada dalam direktori di proyek Anda yang disebut output. File .class akan berada di output/org/javaguy/coolframework/MyClass.class(bersama dengan setiap file lain dalam paket itu). Untuk sampai ke file itu, jalur Anda hanya perlu berisi folder 'output', bukan seluruh struktur paket, karena pernyataan impor Anda memberikan semua informasi itu ke VM.

Sekarang anggaplah Anda mengikat CoolFramework menjadi file .jar, dan memasukkan CoolFramework.jar ke direktori lib di proyek Anda. Anda sekarang perlu dimasukkan lib/CoolFramework.jarke jalur kelas Anda. VM akan mencari di dalam file jar untuk org/javaguy/coolframeworkbagian itu, dan menemukan kelas Anda.

Jadi, classpath berisi:

  • File JAR, dan
  • Jalan menuju puncak hierarki paket.

Bagaimana Anda mengatur classpath Anda?

Cara pertama yang tampaknya semua orang pelajari adalah dengan variabel lingkungan. Pada mesin unix, Anda dapat mengatakan sesuatu seperti:

export CLASSPATH=/home/myaccount/myproject/lib/CoolFramework.jar:/home/myaccount/myproject/output/

Pada mesin Windows Anda harus pergi ke pengaturan lingkungan Anda dan menambah atau memodifikasi nilai yang sudah ada.

Cara kedua adalah menggunakan -cpparameter saat memulai Java, seperti ini:

java -cp "/home/myaccount/myproject/lib/CoolFramework.jar:/home/myaccount/myproject/output/"  MyMainClass

Varian dari ini adalah cara ketiga yang sering dilakukan dengan .shatau .batfile yang menghitung classpath dan meneruskannya ke Jawa melalui -cpparameter.

Ada "gotcha" dengan semua hal di atas. Pada kebanyakan sistem (Linux, Mac OS, UNIX, dll) karakter titik dua (':') adalah pemisah classpath. Di windowsm pemisah adalah titik koma (';')

Jadi apa cara terbaik untuk melakukannya?

Mengatur hal-hal secara global melalui variabel lingkungan adalah buruk, umumnya untuk alasan yang sama dengan variabel global buruk. Anda mengubah variabel lingkungan CLASSPATH sehingga satu program bekerja, dan Anda akhirnya merusak program lain.

-Cp adalah cara untuk pergi. Saya biasanya memastikan variabel lingkungan CLASSPATH saya adalah string kosong tempat saya mengembangkan, kapan pun memungkinkan, sehingga saya menghindari masalah classpath global (beberapa alat tidak senang ketika classpath global kosong - saya tahu dua umum, mega-ribu dolar berlisensi J2EE dan server Java yang memiliki masalah seperti ini dengan alat baris perintah mereka).

bokmann
sumber
12
Blog lain yang dijelaskan dengan baik tentang Apa itu PATH dan CLASSPATH di Jawa - Path vs ClassPath
KNU
Dalam python ada folder bernama Lib di mana Anda dapat menyimpan modul apa saja untuk digunakan kapan saja dengan pernyataan impor sederhana. Apakah ini berbeda dari pengaturan variabel lingkungan CLASSPATH ke direktori untuk paket java pihak ketiga? Meskipun akan bersifat global, tidak perlu mengubah variabel, selain menambahkan lebih banyak paket.
Josie Thompson
Jawaban yang bagus, tetapi untuk boneka di sini: Mengapa Anda tidak perlu menggunakan perintah -cp untuk setiap kelas baru yang Anda buat? Ini pasti diselesaikan secara otomatis oleh sistem Anda, bukan? Tapi bagaimana caranya? Saya kadang-kadang menghadapi masalah di mana "sesuatu" tidak dapat ditemukan di classpath saya - saya kira itu karena saya tidak menambahkannya ke cp, tetapi mengapa kesalahan seperti itu hanya terjadi kadang-kadang bukan selalu? Saya bertanya ini karena, jujur ​​saja, saya tidak pernah memasukkan sesuatu secara manual dengan perintah -cp dan tidak akan tahu apa yang harus dilakukan dengan kesalahan seperti itu
Vic Torious
2
@Vic Classpath perlu berisi direktori di atas hirarki direktori yang sesuai dengan nama paket. Jadi jika saya punya org.javaguy.coolfw, dengan struktur direktori yang sesuai /path/to/org/javaguy/coolfw/, classpath perlu mengandung /path/to/. Jika saya menambahkan paket baru org.javaguy.hotfwdi proyek yang sama, kelas yang dihasilkan (biasanya) berakhir pada /path/to/org/javaguy/hotfw/. Ini membutuhkan classpath untuk memuat /path/to/, yang sudah dilakukannya. Jadi paket baru (dan kelas yang terkandung di dalamnya) tidak memerlukan tambahan baru ke classpath
tjalling
@Vic Untuk contoh dan penjelasan yang lebih nyata, lihat Menguasai Java CLASSPATH (sesuai komentar KNU )
tjalling
67

Anggap itu sebagai jawaban Java untuk variabel lingkungan PATH - OS mencari EXE di PATH, Java mencari kelas dan paket di classpath.

Stephen C
sumber
13

Classpath adalah jalur di mana Java Virtual Machine mencari kelas, paket, dan sumber daya yang ditentukan pengguna dalam program Java.

Dalam konteks ini, format()metode memuat file templat dari jalur ini.

Desintegr
sumber
5

Classpath dalam konteks ini persis seperti apa yang ada dalam konteks umum: di mana pun VM tahu itu dapat menemukan kelas yang akan dimuat, dan sumber daya juga (seperti output.vm dalam kasus Anda).

Saya mengerti Velocity mengharapkan untuk menemukan file bernama output.vm di mana saja di "no package". Ini bisa berupa JAR, folder biasa, ... Akar dari salah satu lokasi di classpath aplikasi.

Romain
sumber
2

Mengatur Variabel Sistem CLASSPATH

Untuk menampilkan variabel CLASSPATH saat ini, gunakan perintah ini di Windows dan UNIX (Bourne shell): Di Windows: C:\> set CLASSPATH Di UNIX: % echo $CLASSPATH

Untuk menghapus konten variabel CLASSPATH saat ini, gunakan perintah ini: Di ​​Windows: C:\> set CLASSPATH= Di UNIX: % unset CLASSPATH; export CLASSPATH

Untuk mengatur variabel CLASSPATH, gunakan perintah ini (misalnya): Di Windows: C:\> set CLASSPATH=C:\users\george\java\classes Di UNIX: % CLASSPATH=/home/george/java/classes; export CLASSPATH

lft93ryt
sumber
1
Walaupun perintah ini mungkin berguna untuk bekerja dengan variabel lingkungan, ini tidak menjawab pertanyaan
Hulk
1

Classpath adalah variabel lingkungan sistem. Pengaturan variabel ini digunakan untuk menyediakan root dari hierarki paket apa pun ke kompiler java.

Bimalendu nath
sumber
1

CLASSPATH adalah variabel lingkungan (yaitu, variabel global dari sistem operasi yang tersedia untuk semua proses) yang diperlukan untuk kompiler dan runtime Java untuk menemukan paket Java yang digunakan dalam program Java. (Mengapa tidak memanggil PACKAGEPATH?) Ini mirip dengan PATH variabel lingkungan lain, yang digunakan oleh shell CMD untuk menemukan program yang dapat dieksekusi.

CLASSPATH dapat diatur dalam salah satu cara berikut:

CLASSPATH can be set permanently in the environment: In Windows, choose control panel  System  Advanced  Environment Variables  choose "System Variables" (for all the users) or "User Variables" (only the currently login user)  choose "Edit" (if CLASSPATH already exists) or "New"  Enter "CLASSPATH" as the variable name  Enter the required directories and JAR files (separated by semicolons) as the value (e.g., ".;c:\javaproject\classes;d:\tomcat\lib\servlet-api.jar"). Take note that you need to include the current working directory (denoted by '.') in the CLASSPATH.

To check the current setting of the CLASSPATH, issue the following command:

> SET CLASSPATH

CLASSPATH can be set temporarily for that particular CMD shell session by issuing the following command:

> SET CLASSPATH=.;c:\javaproject\classes;d:\tomcat\lib\servlet-api.jar

Instead of using the CLASSPATH environment variable, you can also use the command-line option -classpath or -cp of the javac and java commands, for example,

> java classpath c:\javaproject\classes com.abc.project1.subproject2.MyClass3
Unnati Solanki
sumber
0

Anggota statis suatu kelas dapat dipanggil secara langsung tanpa membuat instance objek. Karena metode utama statis Java virtual Machine dapat memanggilnya tanpa membuat instance kelas yang berisi metode utama, yang merupakan titik awal program.


sumber
0

Untuk pengguna linux, dan untuk meringkas dan menambahkan apa yang dikatakan orang lain di sini, Anda harus tahu yang berikut:

  1. $ CLASSPATH adalah apa yang digunakan Java untuk memeriksa banyak direktori untuk menemukan semua kelas yang berbeda yang dibutuhkan untuk skrip Anda (kecuali jika Anda secara eksplisit mengatakan sebaliknya dengan -cp override). Menggunakan -cp mengharuskan Anda melacak semua direktori secara manual dan menyalin-menempelkan baris itu setiap kali Anda menjalankan program (bukan IMO yang disukai).

  2. Karakter titik dua (":") memisahkan direktori yang berbeda. Hanya ada satu $ CLASSPATH dan memiliki semua direktori di dalamnya. Jadi, ketika Anda menjalankan "export CLASSPATH = ...." Anda ingin memasukkan nilai saat ini "$ CLASSPATH" untuk menambahkannya. Sebagai contoh:

    export CLASSPATH=.
    export CLASSPATH=$CLASSPATH:/usr/share/java/mysql-connector-java-5.1.12.jar

    Pada baris pertama di atas, Anda memulai CLASSPATH hanya dengan 'titik' sederhana yang merupakan jalur ke direktori kerja Anda saat ini. Dengan itu, setiap kali Anda menjalankan java itu akan mencari di direktori kerja saat ini (yang Anda berada di) untuk kelas. Pada baris kedua di atas, $ CLASSPATH mengambil nilai yang sebelumnya Anda masukkan (.) Dan menambahkan path ke dirver mysql. Sekarang, java akan mencari driver DAN untuk kelas Anda.

  3. echo $CLASSPATH

    super berguna, dan apa yang dikembalikan harus dibaca seperti daftar semua direktori yang dipisahkan oleh titik dua, dan file .jar, Anda ingin java mencari kelas yang dibutuhkan.

  4. Tomcat tidak menggunakan CLASSPATH. Baca apa yang harus dilakukan tentang hal itu di sini: https://tomcat.apache.org/tomcat-8.0-doc/class-loader-howto.html

Adam Winter
sumber