Bash kullanarak, nasıl bir sınıf tüm dosyaları bir dizin kazanıyorsun
Bu bir olacakgerçektenbash bir guru için basit freebie:
Soru
Bash kullanarak, nasıl bir sınıf tüm dosyaları bir dizin kazanıyorsun?
Ayrıntılar
Bir dizin verildi:
LIB=/path/to/project/dir/lib
hiçbir şey ama *içerir.jar gibi dosyaları:
junit-4.8.1.jar
jurt-3.2.1.jar
log4j-1.2.16.jar
mockito-all-1.8.5.jar
Virgülle ayrılan şeklinde sınıf değişken: bir oluşturmak için ihtiyacım var
CLASSPATH=/path/to/project/dir/lib/junit-4.8.1.jar:/path/to/project/dir/lib/jurt-3.2.1.jar:/path/to/project/dir/lib/log4j-1.2.16.jar:/path/to/project/dir/lib/mockito-all-1.8.5.jar
Neredeyse aradığım mantık ifade eden bazı seudo-kod çizgisinde olacaktır:
for( each file in directory ) {
classpath = classpath ":" LIB file.name
}
Bir şeydirbasitbash script ile bunu yapmak için bir yol?
CEVAP
Yeni Cevap
(Ekim 2012)
El ile sınıf listesi oluşturmanıza gerek yok. Java dizinler için uygun bir joker sözdizimi jar dosyaları içeren destekler.
java -cp "$LIB/*"
(*
dikkat ediniçindetırnak işaretleri.)
man java
açıklama:
Özel bir kolaylık, bir sınıf yolu unsuru içeren bir basename * olduğunu kabul eşdeğer belirten bir liste tüm dosyaları dizin ile uzantısı
.jar
.JAR
(bir java programı söyleyemez arasındaki fark iki çağırmaları).Örneğin, dizin foo içerir
a.jar
b.JAR
, sınıfın yolunu elemanıfoo/*
genişletilmiş birA.jar:b.JAR
hariç sipariş jar dosyalarını olduğu belirtilmemiş. Belirtilen dizin, gizli olanlar da dahil, tüm jar dosyaları listeye dahil edilir. Sınıf girişi*
sadece oluşan geçerli dizindeki tüm jar dosyalarının bir listesi için genişler. TanımladığıCLASSPATH
ortam değişkeni, benzer şekilde genişletilmiş olacak. Herhangi bir sınıf joker genişleme Java sanal makinesi başladı-önce oluşur; hayır Java programı hiç unexpanded joker dışında çevre sorgulayarak göreceksiniz.
Eski Cevap
İyi
Basit ama mükemmel bir çözüm değil
CLASSPATH=$(echo "$LIB"/*.jar | tr ' ' ':')
Bu boşluk içeren dosya isimleri düzgün ele değil, bu ufak bir kusur var. Eğer bu konularda ise biraz daha karmaşık bu sürümü deneyin:
Daha iyi
CLASSPATH=$(find "$LIB" -name '*.jar' -printf '%p:' | sed 's/:$//')
Bu sadece komut destekler bulmaya çalışır -printf
(GNU olarak find
).
Eğer Mac OS X gibi find
, GNU yok eğer doğru değilse, xargs
yerine kullanabilirsiniz:
CLASSPATH=$(find "." -name '*.jar' | xargs echo | tr ' ' ':')
En iyi?
(Garip) bunu yapmak için başka bir yol alan ayırıcı $IFS
değişken değiştirmek için. Bu tuhaf görünümlü çok ama çok iyi Tüm dosya adları ve kullandığı shell built-ins ile davranır.
CLASSPATH=$(JARS=("$LIB"/*.jar); IFS=:; echo "${JARS[*]}")
Açıklama:
JARS
dosya adları bir dizi için ayarlanır.IFS
:
değiştirilir.- Dizi yankılandı ve
$IFS
dizi girdileri arasında ayırıcı olarak kullanılır. Dosya adları anlam aralarında iki nokta üst üste ile yazdırılır.
Tüm bu alt-kabuk yapılır $IFS
değişim kalıcı baaaad olacaktı) değil.
Nasıl&; derleme quot&; Java sınıf dosy...
Nasıl dosyaları kullanarak JSP/Sunucu ...
Nasıl Gıt bir çalışma dizini içine boş...
Yinelemeli olarak kullanarak wget için...
Nasıl bir dizin C veya C kullanarak do...