Sınıf yolu nedir ve nasıl ayarlanır?


324

Sadece bu satırı okuyordum:

Format () yönteminin yaptığı ilk şey output.vm adlı sınıfyolundan bir Velocity şablonu yüklemek.

Lütfen bu bağlamda sınıfyolunun ne anlama geldiğini ve sınıfyolunu nasıl ayarlamam gerektiğini açıklayın.

Yanıtlar:


530

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.jarsınıf yolunuza koymanız gerekecek . VM, org/javaguy/coolframeworkparça için jar dosyasının içine bakar ve sınıfınızı bulur.

Yani, sınıfyolları şunları içerir:

  • JAR dosyaları ve
  • Paket hiyerarşilerinin en üstündeki yollar.

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, -cpJava'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 .shveya .batdosyayla 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).



Python'da, herhangi bir modülü basit bir içe aktarma ifadesiyle kullanmak için depolayabileceğiniz Lib adlı bir klasör vardır. Bu, CLASSPATH ortam değişkenini üçüncü taraf java paketleri için bir dizine ayarlamaktan farklı mıdır? Küresel olsa da, daha fazla paket eklemek dışında değişkeni değiştirmeye gerek yoktur.
Josie Thompson

Güzel cevap, ama buradaki aptallar için: Oluşturduğunuz her yeni sınıf için neden -cp komutunu kullanmanıza gerek yok? Bu kesinlikle sisteminiz tarafından otomatik olarak çözülüyor değil mi? Ama nasıl? Bazen sınıf yolumda "bir şey" bulunamıyor bir sorunla karşılaşıyorum - sanırım öyle çünkü cp için eklemedim, ama neden böyle bir hata her zaman yerine sadece bazen oluşur? Bunu soruyorum, çünkü dürüst olmak gerekirse, -cp komutuyla el ile hiçbir şey eklemedim ve böyle bir hatayla ne yapacağımı
bilemezdim

2
@Vic Sınıf yolunun, paket adına karşılık gelen dizin hiyerarşisinin üstündeki dizini içermesi gerekir. Eğer varsa 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.hotfwAynı 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.
17'de

@Vic Daha somut bir örnek ve açıklama için bkz . Java CLASSPATH'da Mastering (
KNU'nun

67

Java'nın PATH ortam değişkenine cevabı olarak düşünün - İşletim sistemleri PATH'de EXE'leri arar, Java sınıf yolunda sınıfları ve paketleri arar.


13

Sınıf yolu, Java Sanal Makinesi'nin Java programlarında kullanıcı tanımlı sınıfları, paketleri ve kaynakları aradığı yoldur.

Bu bağlamda, format()yöntem bu yoldan bir şablon dosyası yükler.


5

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.


2

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


1
Bu komutlar ortam değişkenleriyle çalışmak için yararlı olsa da, bu soruya cevap vermez
Hulk

1

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.


1

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

0

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.


0

Linux kullanıcıları için, özetlemek ve burada başkalarının söylediklerini eklemek için aşağıdakileri bilmelisiniz:

  1. $ 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.

  2. İ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.

  3. 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.

  4. Tomcat CLASSPATH kullanmaz. Bununla ilgili ne yapacağınızı buradan okuyun: https://tomcat.apache.org/tomcat-8.0-doc/class-loader-howto.html

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.