Bu eğiticide, JavaScript'i kullanarak Java uygulamaları geliştirmenin
Bazel. Çalışma alanınızı oluşturup hedefler ve BUILD
dosyaları gibi temel Bazel kavramlarını gösteren basit bir Java projesi oluşturacaksınız.
Tahmini tamamlanma süresi: 30 dakika.
Neler öğreneceksiniz?
Bu eğitimde şunları öğreneceksiniz:
- Hedef oluşturma
- Projenin bağımlılıklarını görselleştirme
- Projeyi birden fazla hedefe ve pakete ayırma
- Paketler genelinde hedef görünürlüğünü kontrol etme
- Etiketler aracılığıyla referans hedefleri
- Hedef dağıtma
Başlamadan önce
Bazel'i yükleme
Eğitime hazırlanmak için, henüz yüklemediyseniz önce Bazel'i yükleyin.
JDK'yı yükleyin
Java JDK'yi yükleyin (tercih edilen sürüm 11'dir ancak 8 ile 15 arasındaki sürümler desteklenir).
JAVA_HOME ortam değişkenini JDK'yı işaret edecek şekilde ayarlayın.
Linux/macOS'te:
export JAVA_HOME="$(dirname $(dirname $(realpath $(which javac))))"
Windows'da:
- Denetim Masası'nı açın.
- "Sistem ve Güvenlik" > "Sistem" > "Gelişmiş Sistem Ayarları" > "Gelişmiş" sekmesi > "Ortam Değişkenleri..."ne gidin. .
- "Kullanıcı değişkenleri" listesinin (üstteki) altında "Yeni..."yi tıklayın.
- "Değişken adı" alanına
JAVA_HOME
yazın. - "Dizin'e göz at..."ı tıklayın.
- JDK dizinine (örneğin,
C:\Program Files\Java\jdk1.8.0_152
) gidin. - "Tamam"ı tıklayın. kontrol edebilirsiniz.
Örnek projeyi alma
Bazel'in GitHub deposundan örnek projeyi alın:
git clone https://github.com/bazelbuild/examples
Bu eğitimdeki örnek proje, examples/java-tutorial
dizininde yer alır ve aşağıdaki gibi yapılandırılmıştır:
java-tutorial
├── BUILD
├── src
│ └── main
│ └── java
│ └── com
│ └── example
│ ├── cmdline
│ │ ├── BUILD
│ │ └── Runner.java
│ ├── Greeting.java
│ └── ProjectRunner.java
└── WORKSPACE
Bazel ile geliştirin
Çalışma alanını ayarlama
Bir proje oluşturabilmek için önce projenin çalışma alanını kurmanız gerekir. Çalışma alanı projenizin kaynak dosyalarını ve Bazel'ın derleme çıkışlarını barındıran bir dizindir. Bazel'in özel olarak tanıdığı dosyaları da içerir:
Dizini ve içeriğini
WORKSPACE
Bazel çalışma alanı ve projenin dizin yapısının kökünde bulunur.Bazel'e projenin farklı bölümlerinin nasıl derleneceğini söyleyen bir veya daha fazla
BUILD
dosyası. (Çalışma alanında,BUILD
dosyası içeren bir dizin bir pakettir. Paketler hakkında bilgiyi bu eğiticinin ilerleyen bölümlerinde öğreneceksiniz.)
Bir dizini Bazel çalışma alanı olarak atamak için
WORKSPACE
kullanarak bu dosyayı dizinleyebilirsiniz.
Bazel projeyi derlerken tüm girdi ve bağımlılıklar aynı çalışmayacaktır. Farklı çalışma alanlarında bulunan dosyalar birinden bağımsız Bu eğiticinin kapsamı dışındadır.
BUILD dosyasını anlama
BUILD
dosyası, Bazel için farklı türde talimatları içerir.
En önemli tür, Bazel'e istenen çıktıları (ör. yürütülebilir ikili dosyalar veya kitaplıklar) nasıl oluşturacağını söyleyen derleme kuralı'dır. Her bir örnek
BUILD
dosyasındaki bir derleme kuralının adı target olarak adlandırılır ve bir
ve bağımlılıkları
belirlemenize yardımcı olur. Hedefler diğer hedefleri de gösterebilir.
java-tutorial/BUILD
dosyasına göz atın:
java_binary(
name = "ProjectRunner",
srcs = glob(["src/main/java/com/example/*.java"]),
)
Örneğimizde ProjectRunner
hedefi, Bazel'in yerleşik java_binary
kuralını örneklendirir. Kural, Bazel'e bir .jar
dosyası ve sarmalayıcı kabuk komut dosyası (her ikisi de hedefin adıyla adlandırılır) oluşturmasını söyler.
Hedefteki özellikler, bağımlılıkları ve seçenekleri açıkça belirtir.
name
özelliği zorunludur ancak çoğu isteğe bağlıdır. Örneğin,
ProjectRunner
kural hedefi, name
hedefin adı, srcs
belirtir
ve Bazel'in hedefi oluşturmak için kullandığı kaynak dosyaları main_class
belirtir ve
ana yöntemi içeren sınıftır. (Örneğimizde, bir grup kaynak dosyayı tek tek listelemek yerine Bazel'e iletmek için glob işlevinin kullanıldığını fark etmiş olabilirsiniz.)
Projeyi oluşturma
Örnek projenizi derlemek için java-tutorial
dizinine gidin
ve şunu çalıştırın:
bazel build //:ProjectRunner
Hedef etikette, //
bölümü BUILD
dosyasının konumudur
köküne göre (bu örnekte kökün kendisi)
ProjectRunner
ise BUILD
dosyasındaki hedef addır. (
bu eğiticinin sonunda hedef etiketler hakkında daha ayrıntılı bilgi edinebilirsiniz.)
Bazel, aşağıdakine benzer çıktılar üretir:
INFO: Found 1 target...
Target //:ProjectRunner up-to-date:
bazel-bin/ProjectRunner.jar
bazel-bin/ProjectRunner
INFO: Elapsed time: 1.021s, Critical Path: 0.83s
Tebrikler, ilk Bazel hedefinizi oluşturdunuz. Bazel, derleme çıkışlarını çalışma alanının kökündeki bazel-bin
dizinine yerleştirir. Göz atın
ve Bazel'in çıkış yapısına ilişkin bir fikir edinmek için verilerini gözden geçirelim.
Ardından, yeni oluşturulan ikili dosyanızı test edin:
bazel-bin/ProjectRunner
Bağımlılık grafiğini inceleme
Bazel, derleme bağımlılıklarının BUILD dosyalarında açıkça belirtilmesini gerektirir. Bazel, bu ifadeleri kullanarak projenin bağımlılık grafiğini doğru artımlı derlemeler sağlar.
Örnek projenin bağımlılıklarını görselleştirmek için çalışma alanı kökünde şu komutu çalıştırarak bağımlılık grafiğinin metin temsilini oluşturabilirsiniz:
bazel query --notool_deps --noimplicit_deps "deps(//:ProjectRunner)" --output graph
Yukarıdaki komut, Bazel'e hedef //:ProjectRunner
için tüm bağımlılıkları (ana makine ve gizli bağımlılıklar hariç) aramasını ve çıkışı grafik olarak biçimlendirmesini söyler.
Ardından metni GraphViz'e yapıştırın.
Gördüğünüz gibi, projede ek bağımlılık olmadan iki kaynak dosya oluşturan tek bir hedef vardır:
Çalışma alanınızı kurduktan sonra projenizi derleyin ve bağımlılığınızı biraz daha karmaşık hale getirebilirsiniz.
Bazel derlemenizi hassaslaştırın
Küçük projeler için tek bir hedef yeterli olsa da her projeyi büyük projeleri birden çok hedefe ve pakete ayırarak hızlı artımlı yeniden inşa etmek (yani değişiklikleri yeniden oluşturmak) ve derlemelerinizi projenin birden fazla parçasını tek seferde oluşturmaya yardımcı olur.
Birden fazla derleme hedefi belirtme
Örnek proje derlemesini iki hedefe bölebilirsiniz. Şunların içeriğini değiştir:
şunlara sahip java-tutorial/BUILD
dosyası:
java_binary(
name = "ProjectRunner",
srcs = ["src/main/java/com/example/ProjectRunner.java"],
main_class = "com.example.ProjectRunner",
deps = [":greeter"],
)
java_library(
name = "greeter",
srcs = ["src/main/java/com/example/Greeting.java"],
)
Bazel, bu yapılandırmayla önce greeter
kitaplığını, ardından
ProjectRunner
ikili değeri. java_binary
içindeki deps
özelliği, Bazel'e ProjectRunner
ikili programını derlemek için greeter
kitaplığının gerekli olduğunu bildirir.
Projenin bu yeni sürümünü derlemek için aşağıdaki komutu çalıştırın:
bazel build //:ProjectRunner
Bazel, aşağıdakine benzer çıktılar üretir:
INFO: Found 1 target...
Target //:ProjectRunner up-to-date:
bazel-bin/ProjectRunner.jar
bazel-bin/ProjectRunner
INFO: Elapsed time: 2.454s, Critical Path: 1.58s
Ardından, yeni oluşturulan ikili dosyanızı test edin:
bazel-bin/ProjectRunner
Şimdi ProjectRunner.java
öğesini değiştirip projeyi yeniden derlerseniz yalnızca Bazel
bu dosyayı yeniden derler.
Bağımlılık grafiğine baktığınızda ProjectRunner
'ün öncekiyle aynı girişlere bağlı olduğunu ancak derlemenin yapısının farklı olduğunu görebilirsiniz:
Projeyi iki hedefle oluşturmuş oldunuz. ProjectRunner
hedefi derlemeleri
iki kaynak dosyasına ve bir hedefe (:greeter
) bağlıdır. Bu hedefe
kaynak dosya yükleyin.
Birden çok paket kullanma
Şimdi projeyi birden çok pakete ayıralım. src/main/java/com/example/cmdline
dizinine göz atarsanız bir BUILD
dosyasının yanı sıra bazı kaynak dosyaları da içerdiğini görebilirsiniz. Dolayısıyla, Bazel için çalışma alanı
//src/main/java/com/example/cmdline
ve //
olmak üzere iki paket içerir (çünkü
çalışma alanının kök dizininde bir BUILD
dosyası olmalıdır).
src/main/java/com/example/cmdline/BUILD
dosyasına göz atın:
java_binary(
name = "runner",
srcs = ["Runner.java"],
main_class = "com.example.cmdline.Runner",
deps = ["//:greeter"],
)
runner
hedefi, //
paketindeki greeter
hedefine bağlıdır (dolayısıyla
hedef etiketi //:greeter
) kullanın: Bazel, bunu deps
özelliği aracılığıyla bilir.
Bağımlılık grafiğine göz atın:
Ancak derlemenin başarılı olması için visibility
özelliğini kullanarak //src/main/java/com/example/cmdline/BUILD
'daki runner
hedefine //BUILD
'deki hedeflere yönelik açık bir görünürlük vermeniz gerekir. Bunun nedeni, varsayılan olarak
yalnızca aynı BUILD
dosyasındaki diğer hedefler tarafından görülebilir. (Bazel, hedef
uygulama ayrıntılarını içeren kitaplıklar gibi sorunları önlemek için görünürlük
olabilir.)
Bunu yapmak için visibility
özelliğini greeter
hedefine ekleyin
Aşağıda gösterildiği gibi java-tutorial/BUILD
:
java_library(
name = "greeter",
srcs = ["src/main/java/com/example/Greeting.java"],
visibility = ["//src/main/java/com/example/cmdline:__pkg__"],
)
Artık çalışma alanının kökünde aşağıdaki komutu çalıştırarak yeni paketi oluşturabilirsiniz:
bazel build //src/main/java/com/example/cmdline:runner
Bazel, aşağıdakine benzer çıktılar üretir:
INFO: Found 1 target...
Target //src/main/java/com/example/cmdline:runner up-to-date:
bazel-bin/src/main/java/com/example/cmdline/runner.jar
bazel-bin/src/main/java/com/example/cmdline/runner
INFO: Elapsed time: 1.576s, Critical Path: 0.81s
Şimdi yeni derlenen ikili programınızı test edin:
./bazel-bin/src/main/java/com/example/cmdline/runner
Şimdi projeyi, her biri bir tane içeren iki paket halinde derleme yapacak şekilde değiştirdiniz. ve aralarındaki bağımlılıkları anlamanız gerekir.
Hedeflere başvurmak için etiketleri kullanma
Bazel, BUILD
dosyalarında ve komut satırında hedeflere referans vermek için hedef etiketleri kullanır (ör. //:ProjectRunner
veya //src/main/java/com/example/cmdline:runner
). Söz dizimleri aşağıdaki gibidir:
//path/to/package:target-name
Hedef bir kural hedefiyse path/to/package
, BUILD
dosyasını içeren dizinin yoludur ve target-name
, BUILD
dosyasında hedefe verdiğiniz addır (name
özelliği). Hedef bir dosyaysa
hedefse path/to/package
, paketin köküdür ve
target-name
, tam yolu da dahil olmak üzere hedef dosyanın adıdır.
Depo kökündeki hedeflere referans verirken paket yolu boştur, yalnızca //:target-name
kullanın. Aynı BUILD
içindeki hedeflere başvururken
dosyası varsa //
çalışma alanı kök tanımlayıcısını atlayıp yalnızca
:target-name
.
Örneğin, java-tutorial/BUILD
dosyasındaki hedefler için bir paket yolu belirtmeniz gerekmez. Bunun nedeni, çalışma alanı kökünün de bir paket (//
) olması ve iki hedef etiketinizin yalnızca //:ProjectRunner
ve //:greeter
olmasıdır.
Ancak, //src/main/java/com/example/cmdline/BUILD
dosyasındaki hedefler için
//src/main/java/com/example/cmdline
tam paket yolunu belirtmek zorundaydım
ve hedef etiketiniz //src/main/java/com/example/cmdline:runner
idi.
Bir Java hedefini dağıtım için paketleme
Şimdi ikili dosyayı tüm çalışma zamanı bağımlılıkları ile derleyerek dağıtıma yönelik bir Java hedefi paketleyelim. Bu sayede, ikili dosyayı geliştirme ortamınızın dışında çalıştırabilirsiniz.
Hatırlayacağınız gibi, java_binary derleme kuralı bir .jar
ve sarmalayıcı kabuk komut dosyası oluşturur. Şu komutu kullanarak runner.jar
öğesinin içeriğine göz atın:
jar tf bazel-bin/src/main/java/com/example/cmdline/runner.jar
İçerik:
META-INF/
META-INF/MANIFEST.MF
com/
com/example/
com/example/cmdline/
com/example/cmdline/Runner.class
Gördüğünüz gibi runner.jar
, Runner.class
'u içerir ancak bağımlılık öğesi Greeting.class
'yi içermez. Bazel'in oluşturduğu runner
komut dosyası, sınıf yoluna greeter.jar
ekler. Bu nedenle, dosyayı bu şekilde bırakırsanız yerel olarak çalışır ancak başka bir makinede bağımsız olarak çalışmaz. Neyse ki java_binary
kuralı
bağımsız ve dağıtılabilir bir ikili program derlemenizi sağlar. Oluşturmak için
Hedef ada _deploy.jar
:
bazel build //src/main/java/com/example/cmdline:runner_deploy.jar
Bazel, aşağıdakine benzer çıktılar üretir:
INFO: Found 1 target...
Target //src/main/java/com/example/cmdline:runner_deploy.jar up-to-date:
bazel-bin/src/main/java/com/example/cmdline/runner_deploy.jar
INFO: Elapsed time: 1.700s, Critical Path: 0.23s
runner_deploy.jar
'ü derlediniz. Gerekli çalışma zamanı bağımlılıkları içerdiğinden, geliştirme ortamınızdan bağımsız olarak çalıştırabilirsiniz. Bu bağımsız JAR'ın içeriğine göz atmak için
komutuyla aynı komutu girin:
jar tf bazel-bin/src/main/java/com/example/cmdline/runner_deploy.jar
İçerikte çalıştırılacak gerekli tüm sınıflar yer alır:
META-INF/
META-INF/MANIFEST.MF
build-data.properties
com/
com/example/
com/example/cmdline/
com/example/cmdline/Runner.class
com/example/Greeting.class
Daha fazla bilgi
Daha fazla bilgi için:
Geçişli Maven bağımlılıklarını yönetmek için kurallara yönelik rules_jvm_external.
Yerel ve uzak depolarla çalışma hakkında daha fazla bilgi edinmek için Harici Bağımlılıklar başlıklı makaleyi inceleyin.
Bazel hakkında daha fazla bilgi edinmek için diğer kurallar
Bazel ile C++ projeleri oluşturmaya başlamak için C++ derleme eğitimi.
Bazel ile Android ve iOS için mobil uygulama oluşturmaya başlamak istiyorsanız Android uygulama eğitimi ve iOS uygulama eğitimi'ni inceleyin.
Mutlu binalar!