3

Maven Projelerinde AspectJ 8 Desteği

AspectJ’nin en iyi özelliklerinden biri Java kodlarını tam anlamıyla derleme yetkisine sahip olmasıdır. Java karakterine sahip sistemlerde — Android ve JavaFX gibi — AspectJ entegrasyonu bu özellik sayesinde gerçekleşebilmektedir. AspectJ compiler/weaver (ajc), AspectJ kodlarını, Java kodlarını ve .class dosyalarını derleyip dokuma işlemi yapmakta ve tanımlanan JVM içerisinde .class uzantılı dosyalar üretmektedir. Kısaca projeyi çalıştırma aşamasına gelene kadar geçen sürede bu işlemci, tüm derlemeleri ve byte kod dokumalarını birleştirir ve bize çalışan bir program döndürür. Ayrıca, Load-Time Weaving (LTW) ile byte kodları çalışma zamanında da dokuyabiliriz.

Yukarıdaki anlatılanların gerçekleşmesi için maven projelerinde ve ayrıca geliştiricilerin tercih ettikleri diğer geliştirme ortamlarında ajc uygun bir şekilde konfigüre edilmesi gerekmektedir.

  1. Eclipse kullanıcıları için yüklenmesi gereken plug-in: AJDT

  2. IntelliJ IDEA kullanıcılarının yüklemesi gereken AspectJ Plug-in: AJ Plug-in.

  3. Maven projelerinde de AspectJ Maven Plug-in kullanarak aspect birimleri içerisinde yazılan enine kesen kodların esas kodlarla birlikte derlenmesini ve çalışmasını sağlamaktayız.

AspectJ 8

AspectJ dilinin tüm Java özelliklerini içerisinde barındırması için Java dilindeki son gelişmeleri takip etmesi gerekmektedir. Bu şartı bünyesinde barındırdığından dolayı AspectJ, Java sürümlerine göre kendini yenilemekte ve kendi içerisinde de yapılan gelişmeleri Java versiyonunu baz alarak ilerletmektedir. Java 8 aramıza katılmasıyla birlikte AspectJ 8’e de merhaba demiş oluyoruz. AspectJ 8 ilk sürümü 1.8.0 ile Java 8 yeteneklerini ilgi birimleri içerisinde kullanma imkanı sağlamaktadır. Şuan çok amaçlı ilgi tabanlı dil en son 1.8.4 sürümüyle kendisini güncellemektedir. İstenen geliştirme ortamlarında — Eclipse, Intellij IDEA — bu sürümü güncelleyerek ilgiye maruz kalan projelerde kullanılabilir. Maven için ise en son 1.8.3 sürümü çalışmaktadır.

AspectJ 8 gelmesiyle Aspect birimleri içerisinde barındırdığı yetenekler de güçlenmektedir. Yaratılan bir ilgi biriminin içerisinde:

  • Lambda fonksiyonları

  • Default/Statik metodlara sahip arayüzler

  • Stream API ve onunla kullanılan yöntemler

  • Diğer Java 8 ile gelen yenilikçi birimler kullanılabilir.

Ayrıca AspectJ 8, yeni bir birleşim noktasına (join point) daha sahip olmaktır: default ve statik metod çağırma/yürütme noktası. Java 8 ile birlikte gelen default metod ve statik metod yapısı ilgiye muhtaç bir nokta olduğu zamanlarda hem bu metodun çağırılmasında hem de yürütülmesinde gerçekleşecek enine kesen ilgileri bağlama imkanına sahip oluyoruz. Dikkate değer bir bilgi olarak; super anahtar kelimesiyle çağırılan arayüzün kendi varsayılan (default) metodu bir birleşim noktası olarak birlenmemektedir.

ÖNEMLİ
Java 8 yeniliklerini öğrenmek ve dolayısıyla AspectJ 8 ile kullanmak için
Rahman Hocanın hazırlamış olduğu Java 8 E-Kitab sizin için güzel bir başlama noktası olacaktır.

Örnek Maven Projesi

Maven, codehaus.org projesi yoluyla AspectJ plug-in sağlamaktadır. Bu plug-in ile birlikte AspectJ compiler/weaver tetiklenerek ilgi yönelimli projeleri çalışır hale getirmektedir. pom.xml dosyasının içerisini konfigüre ederek istenilen maven projelerinde AspectJ desteğini vermiş oluruz. Bunun için ilk yapılması gereken faaliyet AspectJ Runtime (yani aspectjrt) bağımlılığını projenin içerisine tanıtmaktır.

AspectJ Runtime Bağlılığı:
<dependencies>
    <dependency>
        <! -- The aspectjrt needed to execute a program using AspectJ -->
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjrt</artifactId>
        <version>1.8.3</version>
    </dependency>
</dependencies>

Bu bağlılığı tanıttıktan sonra AspectJ Maven Plug-in ayarlanmalıdır:

AspectJ Eklentisi:
...
<build>
    <plugins>
    	<plugin>
            <groupId>org.codehaus.mojo</groupId>            (1)
            <artifactId>aspectj-maven-plugin</artifactId>
            <version>1.7</version>
            <configuration>
                <complianceLevel>1.8</complianceLevel>      (2)
                <outxml>true</outxml>                       (3)
                <verbose>true</verbose>                     (4)
                <showWeaveInfo>true</showWeaveInfo>         (5)
                <skip>false</skip>                          (6)
                <proceedOnError>false</proceedOnError>      (7)
            </configuration>
            <dependencies>
                <dependency>
                    <groupId>org.aspectj</groupId>
                    <artifactId>aspectjtools</artifactId>   (8)
                    <version>1.8.3</version>
                </dependency>
            </dependencies>
            <executions>
                <execution>
                    <phase>process-sources</phase>          (9)
                    <goals>
                        <goal>compile</goal>
                    </goals>
                </execution>
            </executions>
    	</plugin>
    	...
    </plugins>
</build>
...
  1. aspectj-maven-plugin son versiyonu 1.7 ile tanıtılmakta.

  2. Derleme uyumluluğunu 1.8 olarak ayarlıyoruz çünkü ilgi birimleri içerisinde Java 8 yeteneklerinden faydalanmaktayız (ör. Lambda fonksiyonları). Varsayılan ayarı 1.4.

  3. Opsiyonel olarak derleme sonrasında META-INF konumuna load-time weaving için aop.xml dosyası yaratılıyor.

  4. Hata olduğu zaman hatanın oluşumunda meydana gelen yolu tümüyle göstermek amacıyla konulabilir. Opsiyoneldir.

  5. Dokuma işlemlerini tamamiyle göstermesi için kullanılan opsiyonel özellik.

  6. aspectj plug-in atlanması için koyulan opsiyonel özellik.

  7. Hata durumunda derlemeyi durdurmadan tamamlama ve hatanın oluştuğu kısımları belirtmek için kullanılabilir.

  8. Versiyon geçişlerinde uyumluluğun sağlanması için aspectj plug-in içerisinde `aspectjtools ` bağlılığını da tanıtmak gerekmektedir.

  9. phase etiketinin kaldırılmasıyla maven compile:compile komutunu çalıştıracak aspectj:compile komutundan önce, yani sistemdeki .aj uzantılı dosyalar atlanacak bu da bize esas sınıfların ilgiye maruz kaldığı noktalar derlenemeyeceği için hata fırlatıcak. Sistemdeki kodlar javac ile çalışmamaktadır. Maven compile:compile amacını atlayarak aspectj:compile (yani ajc) çalıştırmak için phase etiketi ile birlikte process-sources ifadesi getirilmektedir.

Bilinmesi gerekebilecek diğer özellikler:

  1. <aspectDirectory> : Varsayılan aspect birimlerinin içinde barınması gereken dizin: src/main/aspect

  2. <forceAjcCompile> : Sistemin ajc uyumluluğu için tekrar sorgulama seçeneği. Varsayılan değeri false.

  3. <testAspectDirectory> : Varsayılan test içeriğinin barınacağı dizin : src/test/aspect

  4. <goal>test-compile</goal> : Eğer gerekli test birimleri sistemde mevcut ise onlarında derlenmesi için gereken komut goals etiketi içine tanımlanabilir. Bu komutla aspectj:test-compile devreye girecektir.

Örnek yapılan çalışır AspectJ 8 desteği olan Maven projesinin hem esas hem de ilgi birimlerine göre düzenlenmiş dizini:

src
\---main
   +---aspect
   |   \---com
   |       \---kodcu
   |           \---app
   |               \---aspects
   |                       DataAspect.aj
   |                       SoftenedHandlerAspect.aj
   |                       SystemStructure.aj
   |                       TraceAspect.aj
   |                       ValidationAspect.aj
   |
   +---java
      \---com
          \---kodcu
              \---app
                  +---data
                  |       Brand.java
                  |       Data.java
                  |
                  +---devices
                  |       Device.java
                  |       Mobile.java
                  |       NoteBook.java
                  |       Tablet.java
                  |
                  +---imp
                  |       Printable.java
                  |
                  +---main
                  |       Startup.java
                  |
                  \---phones
                          Phone.java
                          SmartPhone.java

Sistemde ilgi birimlerinin amacını kısaca açıklamak gerekirse:

  • DataAspect : Data.java sınıfı için oluşturulan bu ilgi biriminde gereken koleksiyonların miktarlarını öğrenmek amacıyla ara tip method ve alan tanımlamaları yapılmıştır. Ayrıca, after tavsiye yapısı içerisinde bu yaratılan alanlara gerekten atama esas ilgiden sonra yapılmaktadır.

  • SoftenedHandlerAspect : Yumuşatılmış istisna yapısı default olan printSignature metodu ve TraceAspect sınıfı içinde tanımlanan parametre almayan, dönüş tipi ve erişim belirleyicisine bakılmaksızın sonu Tracing ile biten metodları kapsamaktadır çünkü bu metodlar potansiyel olarak IOException fırlatma davranışına sahipler.

  • SystemStructure: Sistemin statik yapısı bu ilgi birimi içerisinde düzenlenmektedir.

  • TraceAspect : Sistemin çalışmasıyla birlikte Startup sınıfının içerisinde istenen birleşim noktalarında kendi oluşturduğumuz imza deseni ile tüm metod ve yapıcı çağırmalarını izlemekteyiz. Programın sonlanmasıyla projenin ana dizinine trace.txt dosyası yaratılmış olacak ve birleşim noktalarının izleri bu dosyada yazıyor olacaktır.

  • ValidationAspect : Bu ilgi, Device sınıfının nesnesi oluşturulurken gerekli parametre değerlerinin null olmaması gerektiğini kontrol eden bir karaktere sahiptir.

Bu Maven projesine github.com/kodcu üzerinden erişebilirsiniz.

Bir sonraki yazıda görüşmek üzere.

Hakan Özler

Software Developer

3 Comments

Bir Cevap Yazın