Bazel Eğitimi: Java Projesi Oluşturma

Sorun bildir Kaynağı göster Gece · 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ı 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

  1. Java JDK'yı 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"e gidin > "Sistem" > "Gelişmiş Sistem Ayarları" > "Gelişmiş" sekme > "Ortam Değişkenleri..." .
      3. "Kullanıcı değişkenleri" altında üsttekini seçin, "Yeni..."'yi tıklayın.
      4. "Değişken adı" bölümünde JAVA_HOME değerini girin.
      5. "Dizine Göz At..." seçeneğini 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ğ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ğiniMODULE.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:

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

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

"ProjectRunner" hedefinin bağımlılık grafiği bir bağımlılık ekledikten sonra

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:

Hedef "runner"ın bağımlılık grafiği

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:

Mutlu binalar!