Jawaban:
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.jar
ke jalur kelas Anda. VM akan mencari di dalam file jar untuk org/javaguy/coolframework
bagian itu, dan menemukan kelas Anda.
Jadi, classpath berisi:
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 -cp
parameter 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 .sh
atau .bat
file yang menghitung classpath dan meneruskannya ke Jawa melalui -cp
parameter.
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).
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.hotfw
di 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
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.
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
Classpath adalah variabel lingkungan sistem. Pengaturan variabel ini digunakan untuk menyediakan root dari hierarki paket apa pun ke kompiler java.
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
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.
Untuk pengguna linux, dan untuk meringkas dan menambahkan apa yang dikatakan orang lain di sini, Anda harus tahu yang berikut:
$ 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).
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.
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.
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