Yanıtlar:
Java'da programlama yaparken, kaynak sınıfınızın en üstüne böyle bir şey koyarak yazdığınız sınıf için diğer sınıfları kullanılabilir hale getirirsiniz:
import org.javaguy.coolframework.MyClass;
Veya bazen şunları söyleyerek 'toplu olarak içe aktarırsınız':
import org.javaguy.coolframework.*;
Bu yüzden daha sonra programınızda şunları söylediğinizde:
MyClass mine = new MyClass();
Java Sanal Makinesi derlenmiş sınıfınızı nerede bulacağınızı bilecektir.
VM'nin makinenizdeki her klasörü gözden geçirmesi pratik değildir, bu nedenle VM'ye bakılacak yerlerin bir listesini sağlamanız gerekir. Bu, sınıf yolunuza klasör ve jar dosyaları koyarak yapılır.
Sınıf yolunun nasıl ayarlandığı hakkında konuşmadan önce, .class dosyaları, paketleri ve .jar dosyaları hakkında konuşalım.
İlk olarak, varsayalım ki, Sınıfım projenizin bir parçası olarak oluşturduğunuz ve projenizde adlı bir dizinde output
. .Class dosyası output/org/javaguy/coolframework/MyClass.class
(bu paketteki diğer tüm dosyalarla birlikte) olur. Bu dosyaya ulaşmak için, içe aktarma ifadeniz tüm bu bilgileri VM'ye sağladığı için yolunuzun paketin tamamını değil, 'output' klasörünü içermesi gerekir.
Şimdi, CoolFramework'u bir .jar dosyasına paketlediğinizi ve bu CoolFramework.jar dosyasını projenizdeki bir lib dizinine koyduğunuzu varsayalım. Şimdi lib/CoolFramework.jar
sınıf yolunuza koymanız gerekecek . VM, org/javaguy/coolframework
parça için jar dosyasının içine bakar ve sınıfınızı bulur.
Yani, sınıfyolları şunları içerir:
Sınıf yolunuzu nasıl ayarlıyorsunuz?
Herkesin öğrenmesi gereken ilk yol, ortam değişkenleri ile ilgilidir. Bir unix makinesinde şöyle bir şey söyleyebilirsiniz:
export CLASSPATH=/home/myaccount/myproject/lib/CoolFramework.jar:/home/myaccount/myproject/output/
Bir Windows makinesinde ortam ayarlarınıza gitmeli ve orada bulunan değeri eklemeli veya değiştirmelisiniz.
İkinci yol, -cp
Java'yı başlatırken parametreyi şu şekilde kullanmaktır :
java -cp "/home/myaccount/myproject/lib/CoolFramework.jar:/home/myaccount/myproject/output/" MyMainClass
Bunun bir varyantı, genellikle sınıf yolunu hesaplayan ve parametre aracılığıyla Java'ya ileten bir .sh
veya .bat
dosyayla yapılan üçüncü yoldur -cp
.
Yukarıdakilerin hepsiyle bir "gotcha" vardır. Çoğu sistemde (Linux, Mac OS, UNIX, vb.) İki nokta üst üste karakteri (':') sınıf yolu ayırıcısıdır. Windows'ta ayırıcı noktalı virgül (';')
Peki bunu yapmanın en iyi yolu nedir?
Çevre değişkenleri aracılığıyla küresel olarak bir şeyler ayarlamak kötüdür, genellikle küresel değişkenlerin kötü olmasının nedenleri aynıdır. CLASSPATH ortam değişkenini bir program çalışacak şekilde değiştirirsiniz ve sonunda başka bir programı kırarsınız.
-Cp yolu bu. Genel olarak CLASSPATH ortam değişkenimin, mümkün olduğunda geliştirdiğim boş bir dize olduğundan emin olurum, böylece küresel sınıfyolu sorunlarından kaçınırım (küresel sınıf yolu boşken bazı araçlar mutlu değildir - iki yaygın, mega bini biliyorum dolar lisanslı J2EE ve Java sunucuları, komut satırı araçlarıyla bu tür bir sorunu vardır).
org.javaguy.coolfw
, karşılık gelen dizin yapısı ile /path/to/org/javaguy/coolfw/
, sınıfyolunu içermesi gerekir /path/to/
. org.javaguy.hotfw
Aynı projeye yeni bir paket eklersem, ortaya çıkan sınıf (genellikle) sona erer /path/to/org/javaguy/hotfw/
. Bu, /path/to/
zaten içerdiği sınıf yolunun içermesini gerektirir . Dolayısıyla yeni paket (ve içerdiği sınıflar) sınıf yoluna yeni eklemeler gerektirmez.
Bu bağlamdaki sınıf yolu tam olarak genel bağlamda olan şeydir: VM'nin bildiği her yerde yüklenecek sınıfları ve kaynakları da (sizin durumunuzdaki output.vm gibi) bulabilir.
Velocity "hiçbir paket" herhangi bir yerinde output.vm adlı bir dosya bulmayı beklediğini anlıyorum. Bu bir JAR, normal klasör, ... Uygulamanın sınıf yolundaki konumlardan herhangi birinin kökü olabilir.
CLASSPATH Sistem Değişkenini Ayarlama
Geçerli CLASSPATH değişkenini görüntülemek için, Windows ve UNIX'te (Bourne kabuğu) şu komutları kullanın: Windows'ta: C:\> set CLASSPATH
UNIX'te: % echo $CLASSPATH
CLASSPATH değişkeninin geçerli içeriğini silmek için şu komutları kullanın: Windows'ta: C:\> set CLASSPATH=
UNIX'te: % unset CLASSPATH; export CLASSPATH
CLASSPATH değişkenini ayarlamak için şu komutları kullanın (örneğin): Windows'ta: C:\> set CLASSPATH=C:\users\george\java\classes
UNIX'te: % CLASSPATH=/home/george/java/classes; export CLASSPATH
Sınıfyolu, sistemin ortam değişkenidir. Bu değişkenin ayarı, herhangi bir paket hiyerarşisinin kökünü java derleyicisine sağlamak için kullanılır.
CLASSPATH, Java derleyicisinin ve çalışma zamanının bir Java programında kullanılan Java paketlerini bulması için gereken bir ortam değişkenidir (yani, işletim sisteminin tüm işlemlerde kullanılabilen genel değişkenleri). (Neden PACKAGEPATH çağrılmıyor?) Bu, CMD kabuğu tarafından yürütülebilir programları bulmak için kullanılan başka bir ortam değişkeni PATH'a benzer.
CLASSPATH aşağıdaki yollardan biriyle ayarlanabilir:
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
Bir sınıfın statik üyesi, nesne örneği oluşturmadan doğrudan çağrılabilir. Ana yöntem statik olduğundan Java sanal Makine, programın başlangıç noktası olan ana yöntemi içeren bir sınıf örneği oluşturmadan bunu çağırabilir.
Linux kullanıcıları için, özetlemek ve burada başkalarının söylediklerini eklemek için aşağıdakileri bilmelisiniz:
$ CLASSPATH, betiğiniz için ihtiyaç duyduğu tüm farklı sınıfları bulmak için birden çok dizine bakmak için Java'nın kullandığı yöntemdir (açıkça -cp geçersiz kılma ile aksi belirtilmedikçe). -Cp kullanmak, tüm dizinleri manuel olarak izlemenizi ve programı her çalıştırdığınızda (tercih edilen IMO değil) bu satırı kopyalayıp yapıştırmanızı gerektirir.
İki nokta üst üste (":") karakteri farklı dizinleri ayırır. Sadece bir $ CLASSPATH var ve içinde tüm dizinleri var. Bu nedenle, "export CLASSPATH = ...." komutunu çalıştırdığınızda, eklemek için geçerli değeri "$ CLASSPATH" eklemek istersiniz. Örneğin:
export CLASSPATH=.
export CLASSPATH=$CLASSPATH:/usr/share/java/mysql-connector-java-5.1.12.jar
Yukarıdaki ilk satırda, CLASSPATH'ı geçerli çalışma dizininizin yolu olan basit bir 'nokta' ile başlatacaksınız. Bununla birlikte, java'yı çalıştırdığınızda, sınıflar için geçerli çalışma dizinine (içinde bulunduğunuz) bakacaktır. Yukarıdaki ikinci satırda, $ CLASSPATH önceden girdiğiniz (.) Değeri alır ve bir mysql dirverinin yolunu ekler. Şimdi, java sürücüyü VE sınıflarınızı arayacaktır.
echo $CLASSPATH
süper kullanışlı ve döndürdüğü şey, tüm dizinlerin ve .jar dosyalarının iki nokta üst üste işaretli bir listesi gibi okunması gerekir, java'nın ihtiyaç duyduğu sınıfları aramasını istersiniz.
Tomcat CLASSPATH kullanmaz. Bununla ilgili ne yapacağınızı buradan okuyun: https://tomcat.apache.org/tomcat-8.0-doc/class-loader-howto.html