Bu eğiticide, JavaScript'i kullanarak Java uygulamaları geliştirmenin
Bazel. Çalışma alanınızı kuracak ve
, hedefler ve BUILD
dosyaları gibi temel Bazel kavramlarını göstermektedir.
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 çok hedefe ve pakete bölme
- Paketler genelinde hedef görünürlüğü kontrol edin
- Etiketler aracılığıyla hedeflere başvurma
- Hedef dağıtma
Başlamadan önce
Bazel'i yükleme
Eğiticiye hazırlanmak için önce aşağıdaki durumlarda Bazel'i yükleyin yüklü değil.
JDK'yı yükleyin
Java JDK'yı 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"e gidin > "Sistem" > "Gelişmiş Sistem Ayarları" > "Gelişmiş" sekme > "Ortam Değişkenleri..." .
- "Kullanıcı değişkenleri" altında üsttekini seçin, "Yeni..."'yi tıklayın.
- "Değişken adı" bölümünde
JAVA_HOME
değerini girin. - "Dizine Göz At..." seçeneğini 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ğitimin örnek projesi examples/java-tutorial
içindedir
dizine eklenir ve aşağıdaki gibi yapılandırılır:
java-tutorial
├── BUILD
├── src
│ └── main
│ └── java
│ └── com
│ └── example
│ ├── cmdline
│ │ ├── BUILD
│ │ └── Runner.java
│ ├── Greeting.java
│ └── ProjectRunner.java
└── MODULE.bazel
Bazel ile geliştirin
Çalışma alanını ayarlama
Bir proje oluşturmadan önce projenin çalışma alanını oluşturmanız gerekir. Çalışma alanı projenizin kaynak dosyalarını ve Bazel'ın derleme çıkışlarını barındıran bir dizindir. Google ayrıca, Bazel'in özel olarak tanıdığı dosyaları da içerir:
Dizini ve içeriğini
MODULE.bazel
Bazel çalışma alanı ve projenin dizin yapısının kökünde bulunur.Bazel'e dosyanın farklı bölümlerini nasıl oluşturacağını bildiren bir veya daha fazla
BUILD
dosyası gösterir. (Ç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
MODULE.bazel
kullanarak bu dosyayı dizinleyebilirsiniz.
Bazel projeyi derlerken tüm girdiler 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 oluşturma kuralıdır. Bu kural, Bazel'a
istenen çıkışları (ör. yürütülebilir ikili programlar veya kitaplıklar) 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. Bir hedef,
belirler.
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. Kural Bazel'a şunları söyler:
bir .jar
dosyası ve bir sarmalayıcı kabuk komut dosyası (ikisi de hedeften sonra adlandırılır) derlenir.
Hedefteki özellikler, bağımlılıklarını ve seçeneklerini açıkça belirtir.
name
özelliği zorunlu olsa da birç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ğimizin bu yeni modelin
bir kaynak dosya grubu Bazel'a iletmek için glob'u kullanır
tek tek listelemek yerine).
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 yerleri yapımı
çıkışları çalışma alanının kök dizininde bulunan bazel-bin
dizininde bulunur. Göz atın
ve Bazel'in çıkış yapısına ilişkin bir fikir edinebilirsiniz.
Şimdi yeni derlenen ikili programını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 bağımlılığı grafiğini göstermesi için, çalışma alanı kökü:
bazel query --notool_deps --noimplicit_deps "deps(//:ProjectRunner)" --output graph
Yukarıdaki komut Bazel'a hedef için tüm bağımlılıkları aramasını söyler
//:ProjectRunner
(ana makine ve örtülü bağımlılıklar hariç) ve
çıktı grafiğidir.
Ardından, metni GraphViz içine yapıştırın.
Gördüğünüz gibi projenin tek bir hedefi vardır ve ek bağımlılık yok:
Çalışma alanınızı ayarladıktan 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 programı. java_binary
içindeki deps
özelliği Bazel'a
ProjectRunner
ikili programını derlemek için greeter
kitaplığı gerekir.
Projenin bu yeni sürümünü oluşturmak 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
Şimdi yeni derlenen ikili programını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
değerinin
yine de binanın yapısı farklıdır.
Projeyi iki hedefle oluşturmuş oldunuz. ProjectRunner
hedefi derlemeleri
bir kaynak dosyaya dayanır ve başka bir hedefe (:greeter
) bağlıdır.
kaynak dosya yükleyin.
Birden çok paket kullanma
Şimdi projeyi birden çok pakete ayıralım. Burada
src/main/java/com/example/cmdline
dizinini görüyorsanız bu dizin
bir BUILD
dosyası ve bazı kaynak dosyalar. 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 runner
hedefini açıkça belirtmeniz gerekir
şu konumlardaki hedefler için //src/main/java/com/example/cmdline/BUILD
görünürlüğünde:
visibility
özelliğini kullanarak //BUILD
. 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__"],
)
Şimdi kök dizininde aşağıdaki komutu çalıştırarak yeni paketi oluşturabilirsiniz. seçin:
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
hedefler (örneğin, //:ProjectRunner
veya
//src/main/java/com/example/cmdline:runner
. Söz dizimi aşağıdaki gibidir:
//path/to/package:target-name
Hedef bir kural hedefiyse path/to/package
öğesi
BUILD
dosyasını içeren dizin ve target-name
,
hedefi belirtir (name
özelliği).BUILD
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ünde hedeflere başvururken 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
Çalışma alanı kökünün kendisi bir paket (//
) olduğundan paket yolu ve
iki hedef etiketiniz yalnızca //:ProjectRunner
ve //:greeter
idi.
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 de tüm iletileri içeren ikili programı oluşturarak, bir Java hedefini dağıtım için paket edelim. bağımlılıklarını görebilirsiniz. Bu sayede ikili programı ortamına taşıyabilirsiniz.
Hatırlayacağınız üzere, java_binary derleme kuralı
bir .jar
ve sarmalayıcı kabuk komut dosyası oluşturur. Bu videonun içeriğine göz atın
runner.jar
işlemini şu komutu kullanarak gerçekleştirin:
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
değerini içerir ancak bağımlılığını içermez.
Greeting.class
. Bazel'in oluşturduğu runner
komut dosyası, greeter.jar
özelliğini ekler. Bu nedenle, değeri 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
Az önce oluşturduğunuz runner_deploy.jar
uygulamasını bağımsız olarak çalıştırabilirsiniz
gerekli çalışma zamanını içerdiğinden, geliştirme ortamınıza
ve bildirmeyi konuştuk. 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
Ayrıntılı bilgi için:
rules_jvm_external ve geçişli Maven bağımlılıklarını yönetmek için kullanılan kurallardır.
Uzmanlarla çalışma hakkında daha fazla bilgi edinebileceğiniz Harici Bağımlılıklar yerel ve uzak depolar.
Bazel hakkında daha fazla bilgi edinmek için diğer kurallardan yararlanabilirsiniz.
Uygulama derlemeye başlamak için C++ derleme eğiticisi Bazel ile C++ projeleri.
Android uygulama eğitimi ve iOS uygulama eğitimi) ile başlayın ve Bazel ile Android ve iOS için mobil uygulamalar geliştiriyor.
Mutlu binalar!