Bazel Eğitimi: Java Projesi Oluşturma

Sorun bildirme Kaynağı görüntüleme Nightly · 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

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

  1. Java JDK'yi yükleyin (tercih edilen sürüm 11'dir ancak 8 ile 15 arasındaki sürümler desteklenir).

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

      1. Denetim Masası'nı açın.
      2. "Sistem ve Güvenlik" > "Sistem" > "Gelişmiş Sistem Ayarları" > "Gelişmiş" sekmesi > "Ortam Değişkenleri..."ne gidin. .
      3. "Kullanıcı değişkenleri" listesinin (üstteki) altında "Yeni..."yi tıklayın.
      4. "Değişken adı" alanına JAVA_HOME yazın.
      5. "Dizin'e göz at..."ı tıklayın.
      6. JDK dizinine (örneğin, C:\Program Files\Java\jdk1.8.0_152) gidin.
      7. "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ğiniWORKSPACE 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:

"ProjectRunner" hedefinin bağımlılık grafiği

Ç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:

Bağımlılık eklendikten sonra hedef "ProjectRunner"ın bağımlılık grafiği

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:

Hedef "yürütücü"nün bağımlılık grafiği

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:

Mutlu binalar!