Ana içeriğe geç

4. Gradle Pluginleri#

Projelerde çok kullanılan ve her projede tekrar yazılması gereken işlemleri daha kolay yönetmek amacı ile geliştirilmiştir. Pluginler sayesinde kullanılan 'Build Tool' lara ekstra özellikler kazandırılmaktadır.

Gradle bir yazılım projesi geliştirirken kullanılan inşa aracı yani Build Tool'dur. Günümüzde kullanılan en popüler Build Tool'larındandır. Bu popülerliği sağlamasının en önemli nedeniyse 'Maven' ve 'Ivy' yeteneklerini barındırması ve kullanabilmesidir.

Başlıca gradle pluginleri aşağıdaki gibidir.

  • Generate Package Plugin
  • Hibernate Plugin
  • Liquibase Plugin
  • Mapstruct Plugin
  • Maven Plugin
  • QueryDsl Plugin
  • Spring Plugin
  • Workspace Plugin

Generate Package Plugin#

Projelerde, veri tabanı DDL betiği veya varlık (entity) isimleri üzerinden uygulama katmanların oluşmasını sağlamaktadır. 'hvl-plugin' veya 'hvl-code-generator-plugin' plugin id bilgileriyle eklenmektedir. 'hvl-plugin', varsayılan olarak 'hvl-code-generator-plugin' eklentisini uygulamaktadır. Bundan sebep 'hvl-plugin' dahil edilmiş bir projede 'hvl-code-generator-plugin' dahil edilmesine gerek yoktur.

Projelere iki farklı yöntem ile eklenebilmektedir. Aşağıda 'hvl-plugin' eklentisinin nasıl ekleneceği gösterilmiştir. Eğer yalnız 'hvl-code-generator-plugin' eklentisi eklenmek istenirse yöntemler aynıdır. Yöntemler şunlardır:

DSL kullanımı

plugins {
    id 'hvl-plugin' version hvlGradlePluginVersion
}

Buildscript kullanımı

buildscript {
    repositories {
        maven {
            url 'http://nexus.bulut.ai/repository/framework-plugin-group/'
        }
    }
    dependencies {
        classpath(group: 'tr.com.havelsan.plugin', name: 'hvl-gradle-plugin', version: hvlGradlePluginVersion)
    }
}

apply plugin: 'hvl-gradle-plugin'

Paket içeriği üretimi için generatePackage adlı gradle görevi kullanılmaktadır.

Görev, çalışılan projenin build.gradle seviyesinde terminal veya IDE üzerinden tetiklenebilir.

  • Terminal üzerinden:
gradle generatePackage
  • IDE üzerinden:


Görev çalıştırıldığında aşağıda gösterilen pencere açılır.

Ekranda yer alan girdi alanları ve kullanım amaçları aşağıdaki gibidir:

  • Base Package (Zorunlu) Temel paket adını ifade etmektedir.
  • Type Naming Prefix (Opsiyonel) Sınıf adları için ön ek. Alan CaseFormat.UPPER_CAMEL biçimine uygun olmalıdır.
  • Module Name (Zorunlu) Oluşturulmak istenilen modül adını ifade etmektedir.
  • Base Entity Type (Zorunlu) Kalıtım alınacak temel entity tipini ifade etmektedir. Altyapı tarafından, HvlHardDeleteEntity, HvlSoftDeleteEntity olmak üzere iki adet entity tipi sağlanmaktadır.
  • Entity Generating Mode Varlıklar (entity) ve bağlı komponentlerin üretileceği kaynakğın seçimini ifade etmektedir.
    • Entity Name Varlık (entity) adları girişi için metin giriş alanını etkinleştirmektedir. Birden fazla varlık girişi yapılmak istenirse, varlık adları arasına , konulmalıdır. Veri tabanı şema adı girişi için ${schemaName}.${entityName} biçimi uygulanmalıdır. Örneğin device_mgmt.DlmsMeter
    • Database DDL ANSI SQL spesifikasyonlarına uygun veri tabanı DDL betiği girişi için dosya seçim alanını etkinleştirmektedir. Seçilen DDL dosyası, tablo ilişkileri ve veri doğrulama tanımlarını (constraint) eksiksiz içermelidir.
  • Entity Source (Zorunlu) Seçilen Entity Generating Mode için giriş alanıdır.
  • Proj. Entity/Model içinde yer alacak projeksiyon alanların seçimi sağlamaktadır. Ayrıca entity dahilinde yer almayıp varlık ilişkilerinden gelen alanların veri sorgularına dahil edilmesini temin etmektedir.
  • Lookup. Seçilen varlık (entity) alanları içinden Lookup olarak kullanılacak alanların seçimini sağlamaktadır.
  • Query Expression Sorgu modeli içinde yer alacak alanları ve sorgulama kurallarının seçimini sağlamaktadır.

Gerekli alanlar doldurulduktan sonra Generate butonu kullanılarak entity ve bağlı komponentlerin oluşturulması sağlanır. Generate butonunun her kullanımında oluşturulan çıktılar /generated/sources/hvl-codegen yolu altına çıkartılır. Bu yol generatePackage görevinin her çalıştırılmasında silinir. Çıkarılan dosyaların tamamı yada kullanılmak istenilenleri src/main/java altına kopyalanmalıdır.

Template proje üzerinden gradle projesi oluşturma örneği aşağıda yer alan videoda gösterilmiştir.

DDL betiği seçilerek yapılan bir örnek aşağıda yer alan videoda gösterilmiştir.

  • Backend
  • Frontend

Örnek gösterimde kullanılan DDL betik dosyasını buradan indirilebilirsiniz.

Hibernate Plugin#

Proje içerisinde Hibernate teknolojisi kullanılması durumunda 'Bytecode Enchancement' desteğini sağlamaktadır. Bu yöntem ile veritabanı nesnelerinin(entity) class(bytecode) dosyalarında performans artırmak için değişiklikler yapmaktadır. Böylelikle runtime da veritabanı işlemlerinde performans artırımı sağlanmaktadır.

Projelere iki farklı yöntem ile eklenebilmektedir. Yöntemler şunlardır:

DSL kullanımı

plugins {
    id 'hvl-hibernate-plugin' version hvlHibernatePluginVersion
}

Buildscript kullanımı

buildscript {
    repositories {
        maven {
            url 'http://nexus.bulut.ai/repository/framework-plugin-group/'
        }
    }
    dependencies {
        classpath(group: 'tr.com.havelsan.plugin', name: 'hvl-gradle-hibernate-plugin', version: hvlHibernatePluginVersion)
    }
}

apply plugin: 'hvl-hibernate-plugin'

Pluginin birçok konfigurasyon parametresi bulunmaktadır. Proje içerisinde kullanımı ve parametreler aşağıdaki gibidir.

Konfigurasyon yapısı

hvlHibernate {
  enhance {
    // @Lazy alanların yüklemesi işlemiinde iyileştirme yapılıp yapılmayacağı
    enableLazyInitialization = true

    // Nesne üzerinde değişiklik yapılan alanların izinin tutulup tutulmayacağı
    enableDirtyTracking = true

    // Çift yönlü ilişki yönetiminin yapılıp yapılmayacağı
    enableAssociationManagement = true

    // İlişkisel nesnelerin performans optimızasyonunun yapılıp yapılmayacağı
    enableExtendedEnhancement = false
  }
}

Detaylı incelemek isteyenler için linkler:

Liquibase Plugin#

Proje içerisinde liquibase yeteneklerinin kullanılmasını sağlamaktadır.

diffChangeLog ve generateChangelog taskları geliştirilerek hvl-liquibase task grubu altına taşınmıştır. Ancak liquibase task grubu altındaki diğer taskların kullanımında konfigürasyonları yapıldığı takdirde herhangi bir kısıtlama bulunmamaktadır.

Projelere iki farklı yöntem ile eklenebilmektedir. Yöntemler şunlardır:

DSL kullanımı

plugins {
    id 'hvl-liquibase-plugin' version hvlLiquibasePluginVersion
}

Buildscript kullanımı

buildscript {
    repositories {
        maven {
            url 'http://nexus.bulut.ai/repository/framework-plugin-group/'
        }
    }
    dependencies {
        classpath(group: 'tr.com.havelsan.plugin', name: 'hvl-gradle-liquibase-plugin', version: hvlLiquibasePluginVersion)
    }
}

apply plugin: 'hvl-liquibase-plugin'

Pluginin birçok konfigurasyon parametresi bulunmaktadır. Proje içerisinde kullanımı ve parametreler aşağıdaki gibidir.

Konfigurasyon yapısı

hvlLiquibase {
    gitEnabled = true
    url = "ssh://git@10.150.0.134:7999/javalt/hvl-infra.git"
    branch = "master"
    username = ""
    password = ""
    databaseliquibaseYamlFile = "configuration/framework/spring/application-database-liquibase.yml"
    databaseDatasourceYamlFile = "configuration/framework/spring/application-database-datasource.yml"

    changeLogFile = "src/main/resources/db/changelog/${moduleVersion}/generated-changelog.xml"

    logLevel = '${hvl.liquibase.logLevel}'

    arguments = [schemas: 'oauth']

    diffChangeLog {
//        https://docs.liquibase.com/commands/inspection/diff-changelog.html
        url = '${hvl.liquibase.url}'
        username = '${hvl.liquibase.username}'
        password = '${hvl.liquibase.password}'
        referenceUrl = '${hvl.liquibase.referenceUrl}'
        referenceUsername = '${hvl.liquibase.referenceUsername}'
        referencePassword = '${hvl.liquibase.referencePassword}'
    }

    generateChangelog {
//        https://docs.liquibase.com/commands/inspection/generate-changelog.html
        url = '${hvl.liquibase.referenceUrl}'
        username = '${hvl.liquibase.referenceUsername}'
        password = '${hvl.liquibase.referencePassword}'

        diffTypes = 'data'
    }
}

Liquibase pluginin yaml dosyası parse etme özelliği bulunmaktadır ve parse edilecek yaml dosyası databaseliquibaseYamlFile parametresi olarak verilmelidir. Bu yaml file içerisinden ${hvl.liquibase.url} gibi ifadeler ayrıştırılarak değerlerin okunması sağlanmakdır. Böylece tek bir dosya üzerinden ortak kullanılacak alanların alınabilmesine imkan sağlar.

  • gitEnabled: Yaml dosyasının bir git projesi üzerinden alınması istendiği durumlarda true yapılması gerekmektedir.
  • url: Git üzerinden çekilecek repository'nin url bilgisidir.
  • branch: Git üzerinden çekilecek repository'nin branch bilgisidir.
  • username: Git üzerinden çekilecek repository'nin güvenlik için kullanılması gereken kullanıcı adı bilgisidir.
  • password: Git üzerinden çekilecek repository'nin güvenlik için kullanılması gereken şifre bilgisidir.
  • databaseliquibaseYamlFile: Ayrıştırılacak liquibase yaml dosyasının dosya yolu bilgisidir. Eğer gitEnabled true ise proje içindeki dosya yolu yazılmalıdır. gitEnabled false olduğu durumlarda fiziksel dosya yolunun tamamı yazılmalıdır. Örnek: /home/acuhadaroglu/dev/projects/framework/hvl-infra/configuration/framework/spring/application-database-liquibase.yml
  • databaseDatasourceYamlFile: Ayrıştırılacak datasource yaml dosyasının dosya yolu bilgisidir. databaseliquibaseYamlFile dosyasında ${spring.datasource.username} gibi ifadeler varsa ve bu değerlerin bulunduğu yaml dosyası path'i yazılmalıdır. Örnekte bu değer application-database-datasource.yml içerisinde olduğu için bu dosyanın path'i verilmiştir. Eğer gitEnabled true ise proje içindeki dosya yolu yazılmalıdır. gitEnabled false olduğu durumlarda fiziksel dosya yolunun tamamı yazılmalıdır. Örnek: /home/acuhadaroglu/dev/projects/framework/hvl-infra/configuration/framework/spring/application-database-datasource.yml
  • changeLogFile: Liquibase tarafından oluşturulan script dosyasının hangi dosya yoluna oluşturulacağı bilgisidir. json, sql, yaml, xml gibi dosya uzantılarına destek vermektedir.
  • logLevel: Liquibase çalışırken console'a basılacak log seviyesi bilgisidir.
  • arguments: Ön tanımlı ayarlar dışında Liquibase içerisine verilmek istenen ekstra parametrelerin verilebileceği alan bilgisidir. Değerler map şeklinde verilmelidir.

diffChangeLog

2 veritabanı arasında DDL olarak fark çıkaran task'dır. diffChangeLog plugin'i çalışma mantığı olarak çıktı alınan dosyayı ezeceği için bu dosyaya elle müdahale edildiyse dikkatli olunmalıdır.

  • url: Fark çıkarılacak veritabanı bilgisidir. Buraya önceki versiyonun kurulu olduğu bir veritabanı bilgisi verilmelidir.
  • username: Fark çıkarılacak veritabanı kullanıcı adı bilgisidir.
  • password: Fark çıkarılacak veritabanı şifre bilgisidir.
  • referenceUrl: Fark çıkarılacak referans veritabanı bilgidisir. Buraya güncel veritabanının bilgisi verilmelidir.
  • referenceUsername: Fark çıkarılacak referans veritabanı kullanıcı adı bilgisidir.
  • referencePassword: Fark çıkarılacak referans veritabanı şifre bilgisidir.

generateChangelog

Verilen url bilgisine göre mevcut veribatanın scriptlerini oluşturulan task'dır. Bu task fark almaz, sadece mevcut veritabının çıktısını verir. generateChangelog plugin'i çalışma mantığı olarak çıktı alınan dosyayı ezeceği için bu dosyaya elle müdahale edildiyse dikkatli olunmalıdır.

  • url: Çıktısı alınacak veritabanı bilgisidir.
  • username: Çıktısı alınacak veritabanı kullanıcı adı bilgisidir.
  • password: Çıktısı alınacak veritabanı şifre bilgisidir.
  • diffTypes: Çıktısı alınacak veritabanında hangi türlerin çıktısının alınacağı bilgisidir. Varsayılan olarak sadece data çıktısı alabilecek şekilde ayarlama yapılmıştır. Alabileceği değerler: catalogs, tables, functions, views, columns, indexes, foreignkeys, primarykeys, uniqueconstraints, data, storedprocedures, triggers, sequences, databasepackage, databasepackagebody

Örnek application-database-datasource.yaml

hvl:
  liquibase:
    url: jdbc:postgresql://10.151.233.98:5432/hvl
    username: HVL
    password: hvl12345
    referenceUrl: ${spring.datasource.url}
    referenceUsername: ${spring.datasource.username}
    referencePassword: hvl12345
    logLevel: info

Plugin proje içinde ide üzerinden veya konsol ile kullanılabilir.

Konsol Kullanımı

Kullanım şekli:

  • gradle cleanAll build diffChangeLog
  • gradle cleanAll build generateChangelog

Ide üzerinden kullanım

Mapstruct Plugin#

Proje içerisinde kullanılan veritabanı nesneleri ile transfer nesnelerinin birbirine dönüştürülmesini sağlamaktadır.

Projelere iki farklı yöntem ile eklenebilmektedir. Yöntemler şunlardır:

DSL kullanımı

plugins {
    id 'hvl-mapstruct-plugin' version hvlMapstructPluginVersion
}

Buildscript kullanımı

buildscript {
    repositories {
        maven {
            url 'http://nexus.bulut.ai/repository/framework-plugin-group/'
        }
    }
    dependencies {
        classpath(group: 'tr.com.havelsan.plugin', name: 'hvl-gradle-mapstruct-plugin', version: hvlMapstructPluginVersion)
    }
}

apply plugin: 'hvl-mapstruct-plugin'

Pluginin birçok konfigurasyon parametresi bulunmaktadır. Proje içerisinde kullanımı ve parametreler aşağıdaki gibidir.

Konfigurasyon yapısı

hvlMapStruct {
    autoMoveEnabled = false

    lombok {
        enabled = false
    }

    excludeList = [
            '**/**Configuration.java'
    ]
}
  • autoMoveEnabled: Oluşturulan mapper implementasyonlarının otomatik olarak taşınmasını sağlar.
  • library: (Optional) Mapstruct kütüphane bilgisidir. Varsayılan olarak org.mapstruct:mapstruct:1.4.2.Final değerini kullanmaktadır.
  • annotationProcessorLibrary: (Optional) Mapstruct anotasyon işleyici(annotation processor) kütüphane bilgisidir. Varsayılan olarak org.mapstruct:mapstruct-processor:1.4.2-HVL.Final değerini kullanmaktadır.
  • aptOptions: (Optional List) Mapstruct çalışırken işleyicinin kullandığı ayarların bilgisidir. Varsayılan olarak aşağıdaki değerleri almaktadır.
    [
      'mapstruct.defaultComponentModel=spring',
      'mapstruct.suppressGeneratorVersionInfoComment=true',
      'mapstruct.unmappedTargetPolicy=WARN',
      'mapstruct.defaultInjectionStrategy=constructor',
      'mapstruct.suppressGeneratorTimestamp=true',
    ]
    
  • excludeList: (Optional) Mapstruct çalışırken taranmaması istenen sınıfların bilgisidir. Mapstruct çalışırken compile hatası alınan sınıflar bu listeye eklenip, mapstructın çalışması sağlanabilir. Varsayılan değerler: **/converter/*Impl.java **/*MapperImpl.java

lombok

  • enabled: Lombok desteğinin devreye girmesini sağlar. true yapılması durumunda lombok anotasyonları kullanılabilir hale gelecektir.
  • library: (Optional) Lombok kütüphane bilgisidir. Varsayılan olarak org.projectlombok:lombok:1.18.26 değerini kullanmaktadır.
  • annotationProcessorLibrary: (Optional List) Mapstruct anotasyon işleyici(annotation processor) kütüphane bilgisidir. Varsayılan olarak [org.projectlombok:lombok:1.18.26, org.projectlombok:lombok-mapstruct-binding:0.2.0] değerini kullanmaktadır.

Plugin proje içinde ide üzerinden veya konsol ile kullanılabilir.

Konsol Kullanımı

@Mapper annotation'ına sahip sınıfların implementasyonlarını oluşturmak için kullanılır.

Kullanım şekli: gradle cleanAll build generateMapStructMapper

Ide üzerinden kullanım

ÖRNEK 1:

MusteriModel ve MusteriEntity dönüşümü için yapılması gerekenler:

  1. Mapper interface tanımlanır.
MusteriMapper.java

package tr.com.havelsan.musteri.service.converter;

import org.mapstruct.Mapper;
import tr.com.havelsan.musteri.common.dto.MusteriModel;
import tr.com.havelsan.musteri.service.entity.MusteriEntity;

@Mapper
public interface MusteriMapper {

    MusteriModel musteriEntityToMusteriModel(MusteriEntity entity);

    MusteriEntity musteriModelToMusteriEntity(MusteriModel model);

}

  1. generateMapStructMapper task'ı kullanılarak Mapper'lar otomatik oluşturulur.

  1. MusteriMapperImpl otomatik olarak oluşur
MusteriMapperImpl.java

package tr.com.havelsan.musteri.service.converter;

import javax.annotation.Generated;

import tr.com.havelsan.musteri.common.dto.MusteriModel;
import tr.com.havelsan.musteri.service.entity.MusteriEntity;

@Generated(
        value = "org.mapstruct.ap.MappingProcessor",
        date = "2020-02-14T08:03:32+0300",
        comments = "version: 1.3.1.Final, compiler: javac, environment: Java 1.8.0_192 (Oracle Corporation)"
)
public class MusteriMapperImpl implements MusteriMapper {

    @Override
    public MusteriModel musteriEntityToMusteriModel(MusteriEntity entity) {
        if (entity == null) {
            return null;
        }

        MusteriModel musteriModel = new MusteriModel();

        musteriModel.setId(entity.getId());
        musteriModel.setVersion(entity.getVersion());
        musteriModel.setDateCreated(entity.getDateCreated());
        musteriModel.setDateUpdated(entity.getDateUpdated());
        musteriModel.setCreatedBy(entity.getCreatedBy());
        musteriModel.setUpdatedBy(entity.getUpdatedBy());
        musteriModel.setDeleted(entity.getDeleted());
        musteriModel.setDeletedDate(entity.getDeletedDate());
        musteriModel.setAd(entity.getAd());
        musteriModel.setSoyad(entity.getSoyad());
        musteriModel.setDogumTarihi(entity.getDogumTarihi());
        musteriModel.setKayitTarihi(entity.getKayitTarihi());
        musteriModel.setCinsiyet(entity.getCinsiyet());
        musteriModel.setTip(entity.getTip());
        musteriModel.setUuid(entity.getUuid());

        return musteriModel;
    }

    @Override
    public MusteriEntity musteriModelToMusteriEntity(MusteriModel model) {
        if (model == null) {
            return null;
        }

        MusteriEntity musteriEntity = new MusteriEntity();

        musteriEntity.setId(model.getId());
        musteriEntity.setUuid(model.getUuid());
        musteriEntity.setVersion(model.getVersion());
        musteriEntity.setDateCreated(model.getDateCreated());
        musteriEntity.setDateUpdated(model.getDateUpdated());
        musteriEntity.setCreatedBy(model.getCreatedBy());
        musteriEntity.setUpdatedBy(model.getUpdatedBy());
        musteriEntity.setDeleted(model.getDeleted());
        musteriEntity.setDeletedDate(model.getDeletedDate());
        musteriEntity.setAd(model.getAd());
        musteriEntity.setSoyad(model.getSoyad());
        musteriEntity.setDogumTarihi(model.getDogumTarihi());
        musteriEntity.setKayitTarihi(model.getKayitTarihi());
        musteriEntity.setCinsiyet(model.getCinsiyet());
        musteriEntity.setTip(model.getTip());

        return musteriEntity;
    }
}

  1. Kullanılmak istenen servis üzerinde Autowired edilerek kullanılır
MusteriServiceImpl.java

public class MusteriServiceImpl implements MusteriService {

    @Autowired
    MusteriMapper musteriMapper;

    // other definitions
    @Override
    @CacheEvict(value = "musteriler", allEntries = true)
    public MusteriModel musteriKaydet(MusteriModel musteriModel) {
        MusteriEntity musteriEntity = musteriRepository.saveAndFlush(musteriMapper.musteriModelToMusteriEntity(musteriModel));
        return musteriMapper.musteriEntityToMusteriModel(musteriEntity);
    }
//other methods
}

ÖRNEK 2:

Proje genelinde kullanılmak üzere GenericMapStructMapper interface'i tanımlanır.

GenericMapStructMapper.java

package tr.com.havelsan.musteri.service.converter;


import java.util.List;
import java.util.Set;

/**
 * Model ile entity arasinda donusum yapilacak yontemlerin sunuldugu arayuzdur.
 *
 * @param <M> Transfer nesne sinifi
 * @param <E> Veritabani nesne sinifi
 * @author bocal
 */
public interface GenericMapStructMapper<M, E> {

    M convertToModel(E entity);

    List<M> convertToModelList(List<E> entities);

    E convertToEntity(M model);

    Set<E> convertToEntityList(Set<M> model);

}

MusteriModel ve MusteriEnttiy için MusteriMapper tanımlanır.

MusteriMapStructMapper.java

package tr.com.havelsan.musteri.service.converter;

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
import org.mapstruct.Named;
import tr.com.havelsan.musteri.common.dto.MusteriModel;
import tr.com.havelsan.musteri.service.entity.MusteriEntity;

@Mapper(implementationPackage = "tr.com.havelsan.musteri.service.converter")
public interface MusteriMapStructMapper extends GenericMapStructMapper<MusteriModel, MusteriEntity> {

    @Override
    MusteriModel convertToModel(MusteriEntity entity);

    @Named(value = "lazyModel")
    @Mappings(value = {
            @Mapping(target = "soyad", ignore = true)
    })
    MusteriModel convertToDtoWithoutLazy(MusteriEntity entity);

}

generateMapStructMapper task'ı çalıştırılır ve mapper implementation elde edilir.

MusteriMapStructMapperImpl.java

package tr.com.havelsan.musteri.service.converter;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.annotation.Generated;

import org.springframework.stereotype.Component;
import tr.com.havelsan.musteri.common.dto.MusteriModel;
import tr.com.havelsan.musteri.service.entity.MusteriEntity;

@Generated(
        value = "org.mapstruct.ap.MappingProcessor",
        date = "2020-02-18T08:42:27+0300"
)
@Component
public class MusteriMapStructMapperImpl implements MusteriMapStructMapper {

    @Override
    public List<MusteriModel> convertToModelList(List<MusteriEntity> entities) {
        if (entities == null) {
            return null;
        }

        List<MusteriModel> list = new ArrayList<MusteriModel>(entities.size());
        for (MusteriEntity musteriEntity : entities) {
            list.add(convertToModel(musteriEntity));
        }

        return list;
    }

    @Override
    public MusteriEntity convertToEntity(MusteriModel model) {
        if (model == null) {
            return null;
        }

        MusteriEntity musteriEntity = new MusteriEntity();

        musteriEntity.setId(model.getId());
        musteriEntity.setUuid(model.getUuid());
        musteriEntity.setVersion(model.getVersion());
        musteriEntity.setDateCreated(model.getDateCreated());
        musteriEntity.setDateUpdated(model.getDateUpdated());
        musteriEntity.setCreatedBy(model.getCreatedBy());
        musteriEntity.setUpdatedBy(model.getUpdatedBy());
        musteriEntity.setDeleted(model.getDeleted());
        musteriEntity.setDeletedDate(model.getDeletedDate());
        musteriEntity.setAd(model.getAd());
        musteriEntity.setSoyad(model.getSoyad());
        musteriEntity.setDogumTarihi(model.getDogumTarihi());
        musteriEntity.setKayitTarihi(model.getKayitTarihi());
        musteriEntity.setCinsiyet(model.getCinsiyet());
        musteriEntity.setTip(model.getTip());

        return musteriEntity;
    }

    @Override
    public Set<MusteriEntity> convertToEntityList(Set<MusteriModel> model) {
        if (model == null) {
            return null;
        }

        Set<MusteriEntity> set = new HashSet<MusteriEntity>(Math.max((int) (model.size() / .75f) + 1, 16));
        for (MusteriModel musteriModel : model) {
            set.add(convertToEntity(musteriModel));
        }

        return set;
    }

    @Override
    public MusteriModel convertToModel(MusteriEntity entity) {
        if (entity == null) {
            return null;
        }

        MusteriModel musteriModel = new MusteriModel();

        musteriModel.setId(entity.getId());
        musteriModel.setVersion(entity.getVersion());
        musteriModel.setDateCreated(entity.getDateCreated());
        musteriModel.setDateUpdated(entity.getDateUpdated());
        musteriModel.setCreatedBy(entity.getCreatedBy());
        musteriModel.setUpdatedBy(entity.getUpdatedBy());
        musteriModel.setDeleted(entity.getDeleted());
        musteriModel.setDeletedDate(entity.getDeletedDate());
        musteriModel.setAd(entity.getAd());
        musteriModel.setSoyad(entity.getSoyad());
        musteriModel.setDogumTarihi(entity.getDogumTarihi());
        musteriModel.setKayitTarihi(entity.getKayitTarihi());
        musteriModel.setCinsiyet(entity.getCinsiyet());
        musteriModel.setTip(entity.getTip());
        musteriModel.setUuid(entity.getUuid());

        return musteriModel;
    }

    @Override
    public MusteriModel convertToDtoWithoutLazy(MusteriEntity entity) {
        if (entity == null) {
            return null;
        }

        MusteriModel musteriModel = new MusteriModel();

        musteriModel.setId(entity.getId());
        musteriModel.setVersion(entity.getVersion());
        musteriModel.setDateCreated(entity.getDateCreated());
        musteriModel.setDateUpdated(entity.getDateUpdated());
        musteriModel.setCreatedBy(entity.getCreatedBy());
        musteriModel.setUpdatedBy(entity.getUpdatedBy());
        musteriModel.setDeleted(entity.getDeleted());
        musteriModel.setDeletedDate(entity.getDeletedDate());
        musteriModel.setAd(entity.getAd());
        musteriModel.setDogumTarihi(entity.getDogumTarihi());
        musteriModel.setKayitTarihi(entity.getKayitTarihi());
        musteriModel.setCinsiyet(entity.getCinsiyet());
        musteriModel.setTip(entity.getTip());
        musteriModel.setUuid(entity.getUuid());

        return musteriModel;
    }
}

Detaylı incelemek isteyenler için linkler

Lombok#

Mapstruct plugininde konfigürasyon yaparak projede kolaylıkla lombok kullanımına başlanabilir. Mapstruct'ın oluşturduğu dosyalar ile entegre çalışabilmektedir. Böylece lombok kullanılan entity ve modeller mapstruct'ı engellemeyecektir.


drawing Nasıl konfigüre edilir?

build.gradle dosyası içerisindeki extensionda aşağıdaki gibi ayarlama yapılmalıdır.

hvlMapStruct {
    .
    .
    .

    lombok {
        enabled = true
    }

    .
    .
    .
}

Kod build edildiğinde lombok otomatik olarak çalışarak class dosyalarını oluşturmaktadır. Bunun dışında plugin ile birlikte delombok gibi bazı lombok taskları da kullanıma açılmaktadır.

Bu tasklar proje içinde ide üzerinden veya konsol ile kullanılabilir.

Konsol Kullanımı

Lombok anotasyonlarına sahip sınıfların java dosyalarını oluşturmak için kullanılır. Sınıflar varsayılan olarak build/generated/delombok altına oluşturulur.

Kullanım şekli: gradle delombok

Ide üzerinden kullanım

Örnek Lombok Kullanımı

HvlJpaSample.java

package tr.com.havelsan.javarch.samples.jpa.data.entity;

import lombok.Data;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import tr.com.havelsan.javarch.data.jpa.crypto.converter.HvlStringCryptoConverter;
import tr.com.havelsan.javarch.domain.model.entity.HvlLocalizedEntity;
import tr.com.havelsan.javarch.domain.model.entity.HvlLocalizedId;
import tr.com.havelsan.javarch.domain.model.entity.HvlSoftDeleteEntity;
import tr.com.havelsan.javarch.samples.jpa.data.constraint.HvlJpaSampleConstraint;

import javax.persistence.*;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
import java.util.Map;

/**
 * @author javarch
 */
@Entity
@Table(name = HvlJpaSample.TABLE_NAME)
@Data
public class HvlJpaSample extends HvlSoftDeleteEntity {

    //Table Name
    public static final String TABLE_NAME = "SAMPLE1";

    //Columns
    public static final String NAME_COLUMN = "NAME";
    public static final String SURNAME_COLUMN = "SURNAME";
    public static final String DESCRIPTION_COLUMN = "DESCRIPTION";

    //Foreign Keys
    protected static final String SAMPLE1_DETAIL_MAPPED_BY = "sample1";
    protected static final String SAMPLE1_DETAIL_MAPPED_KEY =
            HvlLocalizedEntity.LOCALIZED_ID_FIELD + "." + HvlLocalizedId.LOCALE_FIELD;

    @Column(name = NAME_COLUMN)
    @NotBlank
    @Size(max = HvlJpaSampleConstraint.NAME_SIZE)
    private String name;

    @Column(name = SURNAME_COLUMN)
    @NotBlank
    @Size(max = HvlJpaSampleConstraint.SURNAME_SIZE)
    @Convert(converter = HvlStringCryptoConverter.class)
    private String surname;

    @OneToMany(mappedBy = SAMPLE1_DETAIL_MAPPED_BY, cascade = {CascadeType.ALL}, orphanRemoval = true)
    @MapKey(name = SAMPLE1_DETAIL_MAPPED_KEY)
    @org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL)
    private Map<String, HvlJpaSampleDetail> detailMap;

}

Lombok'un @Data anotasyonu kullanımı sonucunda aşağıdaki gibi bir class dosyası oluşmaktadır.

HvlJpaSample.class

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//

package tr.com.havelsan.javarch.samples.jpa.data.entity;

import java.util.Map;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Convert;
import javax.persistence.Entity;
import javax.persistence.MapKey;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;

import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import tr.com.havelsan.javarch.data.jpa.crypto.converter.HvlStringCryptoConverter;
import tr.com.havelsan.javarch.domain.model.entity.HvlSoftDeleteEntity;

@Entity
@Table(
        name = "SAMPLE1"
)
public class HvlJpaSample extends HvlSoftDeleteEntity {
    public static final String TABLE_NAME = "SAMPLE1";
    public static final String NAME_COLUMN = "NAME";
    public static final String SURNAME_COLUMN = "SURNAME";
    public static final String DESCRIPTION_COLUMN = "DESCRIPTION";
    protected static final String SAMPLE1_DETAIL_MAPPED_BY = "sample1";
    protected static final String SAMPLE1_DETAIL_MAPPED_KEY = "localizedId.locale";
    @Column(
            name = "NAME"
    )
    private @NotBlank
    @Size(
            max = 50
    ) String name;
    @Column(
            name = "SURNAME"
    )
    @Convert(
            converter = HvlStringCryptoConverter.class
    )
    private @NotBlank
    @Size(
            max = 50
    ) String surname;
    @OneToMany(
            mappedBy = "sample1",
            cascade = {CascadeType.ALL},
            orphanRemoval = true
    )
    @MapKey(
            name = "localizedId.locale"
    )
    @Cache(
            usage = CacheConcurrencyStrategy.TRANSACTIONAL
    )
    private Map<String, HvlJpaSampleDetail> detailMap;

    public HvlJpaSample() {
    }

    public String getName() {
        return this.name;
    }

    public String getSurname() {
        return this.surname;
    }

    public Map<String, HvlJpaSampleDetail> getDetailMap() {
        return this.detailMap;
    }

    public void setName(final String name) {
        this.name = name;
    }

    public void setSurname(final String surname) {
        this.surname = surname;
    }

    public void setDetailMap(final Map<String, HvlJpaSampleDetail> detailMap) {
        this.detailMap = detailMap;
    }

    public boolean equals(final Object o) {
        if (o == this) {
            return true;
        } else if (!(o instanceof HvlJpaSample)) {
            return false;
        } else {
            HvlJpaSample other = (HvlJpaSample) o;
            if (!other.canEqual(this)) {
                return false;
            } else {
                label47:
                {
                    Object this$name = this.getName();
                    Object other$name = other.getName();
                    if (this$name == null) {
                        if (other$name == null) {
                            break label47;
                        }
                    } else if (this$name.equals(other$name)) {
                        break label47;
                    }

                    return false;
                }

                Object this$surname = this.getSurname();
                Object other$surname = other.getSurname();
                if (this$surname == null) {
                    if (other$surname != null) {
                        return false;
                    }
                } else if (!this$surname.equals(other$surname)) {
                    return false;
                }

                Object this$detailMap = this.getDetailMap();
                Object other$detailMap = other.getDetailMap();
                if (this$detailMap == null) {
                    if (other$detailMap != null) {
                        return false;
                    }
                } else if (!this$detailMap.equals(other$detailMap)) {
                    return false;
                }

                return true;
            }
        }
    }

    protected boolean canEqual(final Object other) {
        return other instanceof HvlJpaSample;
    }

    public int hashCode() {
        int PRIME = true;
        int result = 1;
        Object $name = this.getName();
        result = result * 59 + ($name == null ? 43 : $name.hashCode());
        Object $surname = this.getSurname();
        result = result * 59 + ($surname == null ? 43 : $surname.hashCode());
        Object $detailMap = this.getDetailMap();
        result = result * 59 + ($detailMap == null ? 43 : $detailMap.hashCode());
        return result;
    }

    public String toString() {
        String var10000 = this.getName();
        return "HvlJpaSample(name=" + var10000 + ", surname=" + this.getSurname() + ", detailMap=" + this.getDetailMap() + ")";
    }
}

Lombok'un tüm özelliklerine erişmek için linkler

Maven Plugin#

Proje içerisinde Maven teknolojisinin yeteneklerini kullanmamızı sağlamaktadır. Daha çok 'Dependency Managemet' ve ' Publishing' önem taşımaktadır.

Projelere iki farklı yöntem ile eklenebilmektedir. Yöntemler şunlardır:

DSL kullanımı

plugins {
    id 'hvl-maven-plugin' version hvlMavenPluginVersion
}

Buildscript kullanımı

buildscript {
    repositories {
        maven {
            url 'http://nexus.bulut.ai/repository/framework-plugin-group/'
        }
    }
    dependencies {
        classpath(group: 'tr.com.havelsan.plugin', name: 'hvl-gradle-maven-plugin', version: hvlMavenPluginVersion)
    }
}

apply plugin: 'hvl-maven-plugin'

Pluginin birçok konfigurasyon parametresi bulunmaktadır. Proje içerisinde kullanımı ve parametreler aşağıdaki gibidir.

Konfigurasyon yapısı

hvlMaven {
    // Kullanılacak olan maven konfigurasyon dosyası
    settingsXmlFilePath = System.getProperty("user.home") + '/.m2/settings.xml'
    publishing {
        // Publish bilgisi
        info = [release_offline   : [versionSuffix: '', // Versiyon bilgisine son ek eklemeyi sağlar.
                                     name         : 'framework',
                                     url          : 'http://10.17.1.57:8083/artifactory/libs-release-local/'],
                release_framework : [versionSuffix: '',
                                     name         : 'framework', // Credentials bilgisi  maven settings dosyasından alınmasını sağlar.
                                     url          : 'http://10.151.18.26:8081/artifactory/libs-release-local/'],
                snapshot_framework: [versionSuffix: '-SNAPSHOT',
                                     username     : 'framework',  // Credentials bilgisi username, password olarak verilmiştir.
                                     password     : 'password',
                                     url          : 'http://10.151.18.26:8081/artifactory/libs-snapshot-local/']]
        // Publish scope bilgisi
        scope = 'snapshot_framework'
    }
}

hvlRepositories {
    // Repositories bilgisi
    info = [online   : [[url: ['https://repo.spring.io/release/'
                               , 'https://repo.spring.io/snapshot/'
                               , 'https://repo.spring.io/libs-release/'
                               , 'https://repo.spring.io/libs-milestone-local/'
                               , 'https://repo.spring.io/libs-release-local/'
                               , 'https://repo.maven.apache.org/maven2/'
                               , 'https://repo.spring.io/milestone/'
                               , 'https://repo.gradle.org/gradle/libs-releases-local/'
                               , 'https://jcenter.bintray.com/'
                               , 'https://mvnrepository.com/artifact/'
                               , 'https://plugins.gradle.org/m2/']]],
            offline  : [[name: 'framework',
                         url : ['http://10.17.1.57:8083/artifactory/mbs_local/']]],
            framework: [[username: 'framework',  // Credentials bilgisi username, password olarak verilmiştir.
                         password: 'password',
                         url     : ['http://10.151.18.26:8081/artifactory/mbs_local/']]]]
    // Repositories scope bilgisi
    scope = 'framework'
}

Plugin proje içinde ide üzerinden veya konsol ile kullanılabilir.

Konsol kullanımı

- publish komutu:
  Verilen url adresine oluşturulan kütüphaneyenin dosyalarını gönderir.
  Parametreler:
  - publishingScope
    Kullanım şekli:
    gradle cleanAll build publish -DpublishingScope=snapshot_gonexus
- publishToMavenLocal
  .m2 altına kütüphaneyenin dosyalarını gönderir.
  Parametreler:
   - publishingScope
     Kullanım şekli:
     gradle cleanAll build publishToMavenLocal -DpublishingScope=snapshot_gonexus

Ide üzerinden kullanımı

Proje içerisinde örnek kullanım şekli:

settings.gradle kullanımı

gradle.ext {
    // Environment
    environment = [
            java    : [
                    sourceCompatibility: 1.8,
                    targetCompatibility: 1.8
            ],
            encoding: [
                    type: 'UTF-8'
            ],
            maven   : [
                    settingsXmlFilePath: System.getProperty("user.home") + '/.m2/settings.xml'
            ],
            project : [
                    publishingInfo   : [
                            release_offline   : [versionSuffix: '',
                                                 name         : 'framework',
                                                 url          : 'http://10.17.1.57:8083/artifactory/libs-release-local/'],
                            release_framework : [versionSuffix: '',
                                                 name         : 'framework',
                                                 url          : 'http://10.151.18.26:8081/artifactory/libs-release-local/'],
                            release_gonexus   : [versionSuffix: '',
                                                 name         : 'framework-nexus-supervisor',
                                                 url          : 'http://nexus.bulut.ai/repository/framework-releases/'],
                            snapshot_framework: [versionSuffix: '-SNAPSHOT',
                                                 username     : 'framework',
                                                 password     : 'password',
                                                 url          : 'http://10.151.18.26:8081/artifactory/libs-snapshot-local/'],
                            snapshot_gonexus  : [versionSuffix: '-SNAPSHOT',
                                                 name         : 'framework-plugin-snapshots',
                                                 url          : 'http://nexus.bulut.ai/repository/framework-snapshots/'],
                    ],
                    repositoriesInfo : [
                            online   : [[url: ['https://repo.spring.io/release/'
                                               , 'https://repo.spring.io/snapshot/'
                                               , 'https://repo.spring.io/libs-release/'
                                               , 'https://repo.spring.io/libs-milestone-local/'
                                               , 'https://repo.spring.io/libs-release-local/'
                                               , 'https://repo.maven.apache.org/maven2/'
                                               , 'https://repo.spring.io/milestone/'
                                               , 'https://repo.gradle.org/gradle/libs-releases-local/'
                                               , 'https://jcenter.bintray.com/'
                                               , 'https://mvnrepository.com/artifact/'
                                               , 'https://plugins.gradle.org/m2/']]],
                            offline  : [[name: 'framework',
                                         url : ['http://10.17.1.57:8083/artifactory/mbs_local/']]],
                            framework: [[username: 'framework',
                                         password: 'password',
                                         url     : ['http://10.151.18.26:8081/artifactory/mbs_local/']]],
                            gonexus  : [[name: 'framework-nexus-dev',
                                         url : ['http://nexus.bulut.ai/repository/framework-group/']]],
                    ],
                    publishingScope  : 'release_gonexus',
                    repositoriesScope: 'online'
            ],
    ]
}

build.gradle kullanımı

hvlMaven {
    settingsXmlFilePath = gradle.environment.maven.settingsXmlFilePath
    publishing {
        info = gradle.environment.project.publishingInfo
        scope = gradle.environment.project.publishingScope
    }
}

hvlRepositories {
    info = gradle.environment.project.repositoriesInfo
    scope = gradle.environment.project.repositoriesScope
}

QueryDsl Plugin#

Proje içerisinde Hibernate veya JPA teknolojilerinde sorgu kriteri oluşturmak amacı veritabanı nesnesine ait sorgu nesnesi oluşturmaya sağlamaktadır.

Projelere iki farklı yöntem ile eklenebilmektedir. Yöntemler şunlardır:

DSL kullanımı

plugins {
    id 'hvl-querydsl-plugin' version hvlQuerydslPluginVersion
}

Buildscript kullanımı

buildscript {
    repositories {
        maven {
            url 'http://nexus.bulut.ai/repository/framework-plugin-group/'
        }
    }
    dependencies {
        classpath(group: 'tr.com.havelsan.plugin', name: 'hvl-querydsl-plugin', version: hvlQuerydslPluginVersion)
    }
}

apply plugin: 'hvl-querydsl-plugin'

Konfigurasyon yapısı

hvlQuerydsl {
  jpa = true
  autoMoveEnabled = true
}

Genelde projelerde yukarıdaki şekilde kullanılmaktadır ancak bunun dışında bir çok konfigürasyon mevcuttur.

Konfigürasyon Tip Açıklama Varsayılan Değer
aptLibrary String Querydsl annotation processor kütüphanesi com.querydsl:querydsl-apt:5.0.0:jakarta
jakartaPersistencelibrary String Jakarta persistence kütüphanesi jakarta.persistence:jakarta.persistence-api:3.1.0
jpa boolean Jpa desteği false
jdo boolean Jdo desteği false
hibernate boolean Hibernate desteği false
morphia boolean Morphia desteği false
roo boolean Roo desteği false
springDataMongo boolean Spring data Mongodb desteği false
querydslDefault boolean Querydsl varsayılan desteği false
lombok boolean Jdo desteği false
ldap boolean Jdo desteği false
autoMoveEnabled boolean Oluşturulan query dosyalarını entity dizinine otomatik olarak taşır. false
suffix String Oluşturulan query dosyalarının isimleri için suffix bilgisidir. Query
packageSuffix String Oluşturulan query dosyalarının oluşturulacağı paket adı suffix bilgisidir. .query
aptOptions List Annotation processor çalışırken kullanılacak options bilgisidir. ['querydsl.prefix=','querydsl.suffix=' + this.suffix,'querydsl.packageSuffix=' + this.packageSuffix]


Plugin proje içinde ide üzerinden veya konsol ile kullanılabilir.

Konsol kullanımı

generateQueryModel komutu: Verilen url adresine oluşturulan kütüphaneyenin dosyalarını gönderir. Kullanım şekli: gradle generateQueryModel

Ide üzerinden kullanımı

Detaylı incelemek isteyenler için linkler

Spring Plugin#

Plugin sayesinde Gradle ile Spring teknolojilerini kullanmamızı sağlamaktadır. Spring üzerinde profil temelli jar ve docker image oluşturma yeteneği sağlamaktadır. Aynı zamanda Spring projesi içinde Gradle properties ve konfigurasyon verilerini kullanmamızı sağlamaktadır.

Projelere iki farklı yöntem ile eklenebilmektedir. Yöntemler şunlardır:

DSL kullanımı

plugins {
    id 'hvl-spring-plugin' version hvlSpringPluginVersion
}

Buildscript kullanımı

buildscript {
    repositories {
        maven {
            url 'http://nexus.bulut.ai/repository/framework-plugin-group/'
        }
    }
    dependencies {
        classpath(group: 'tr.com.havelsan.plugin', name: 'hvl-gradle-spring-plugin', version: hvlSpringPluginVersion)
    }
}

apply plugin: 'hvl-spring-plugin'

Pluginin birçok konfigurasyon parametresi bulunmaktadır. Proje içerisinde kullanımı ve parametreler aşağıdaki gibidir.

Konfigurasyon yapısı

hvlSpring {
    profile {
        enabled = true
        info = [
                'general': [
                        archiveName: 'general-server', // Oluşacak jar ismi
                        name       : project(':general').name,
                        version    : project(':general').version,
                        buildArgs  : ['RESOURCE_JAR_FILE': project(':general').name, 'CONTAINER_JAR_FILE': project(':general').name], // Dockerfile parametreleri
                        project    : [project(':general')],
                        'tasks'    : [
                                archiveName: 'tasks-server',
                                name       : project(':tasks').name,
                                version    : project(':tasks').version,
                                buildArgs  : ['RESOURCE_JAR_FILE': project(':tasks').name, 'CONTAINER_JAR_FILE': project(':tasks').name],
                                project    : [project(':tasks')]
                        ]
                ]
        ]
    }

    docker {
        settingsXmlFilePath = gradle.environment.docker.settingsXmlFilePath
        archiveName = project.name
        version = project.version
        buildArgs = ['RESOURCE_JAR_FILE': archiveName, 'CONTAINER_JAR_FILE': archiveName]
        publishing {
            info = gradle.environment.project.dockerPublishingInfo
            scope = gradle.environment.project.dockerPublishingScope
        }
    }
}

Genelde projelerde yukarıdaki şekilde kullanılmaktadır ancak bunun dışında bir çok konfigürasyon mevcuttur.

hvlSpring konfigürasyon tablosu:

Konfigürasyon Tip Açıklama Varsayılan Değer
project Project İşlem yapılacak proje bilgisidir. Mevcut proje (project)
archiveName String Oluşturulacak dosyanın isim bilgisidir. Mevcut proje ismidir. (project.getName())
outputJarPath String Oluşturulacak jar'ın path bilgisidir. {user.home}/.hvl-gradle-spring-plugin/{project.name}
profile HvlProfileExtension Profile konfigürasyonudur.
docker HvlDockerExtension Docker konfigürasyonudur.

profile konfigürasyon tablosu:

Konfigürasyon Açıklama Varsayılan Değer
enabled Boolean Profillemenin devrede olup olmadığı bilgisidir. false
info Map> Her bir profilin özelliklerinin verildiği alandır.
profile String Jar oluşturulurken kullanılacak profil bilgisidir. Bu değer komut satırından -Dspring.profiles.active şeklinde de verilebilmektedir. all

Oluşturulacak jar'ın versionSuffix değerini ezmek için -DversionSuffix parametresi kullanılabilir.

Oluşturulacak jar'ın profile değerini ezmek için -Dspring.profiles.active parametresi kullanılabilir.

docker konfigürasyon tablosu:

Konfigürasyon Tip Açıklama Varsayılan Değer
project Project İşlem yapılacak proje bilgisidir. false
settingsXmlFilePath String Docker pushlamak için giriş bilgilerinin bulunduğu dosya path'idir. System.getProperty("user.home") + '/.docker/settings.xml
autoLogout boolean İşlem tamamlandıktan sonra docker repository'den otomatik logout yapılıp yapılmayacağı bilgisidir. false
name String Oluşacak docker'ın isim bilgisidir. Profile içindeki infoda bu bilgi varsa öncelikli olarak profil içindeki kullanılır.
dockerfile File File türünden dockerFile bilgisidir. project.file("Dockerfile")
dependencies Set Docker oluşturma işlemi öncesi çalışması istenen task bilgileridir.
tags Set Oluşturulacak docker'a verilecek tag bilgileridir.
namedTags Map Oluşturulacak docker'a verilecek tag bilgileridir. (taskName, tagName)
labels Map Docker oluştururken cli'daki --label argümanına denk gelen bilgidir.
buildArgs Map Docker oluştururken cli'daki --build-arg argümanına denk gelen bilgidir. Profile içindeki infoda bu bilgi varsa öncelikli olarak profil içindeki kullanılır.
pull boolean Docker oluştururken cli'daki --pull argümanına denk gelen bilgidir. false
noCache boolean Docker oluştururken cli'daki --no-cache argümanına denk gelen bilgidir. false
network String Docker oluştururken cli'daki --network argümanına denk gelen bilgidir.
copySpec CopySpec Dosya işlemleri için kullanılan copyspec nesnesidir. project.copySpec()


Plugin proje içinde ide üzerinden veya konsol ile kullanılabilir.

Konsol kullanımı Kaynak kodunu genişlet

Konsol kullanımı

- docker komutu:
  Local docker içerisine image oluşturmayı sağlamaktadır.
  Parametreler:
  - spring.profiles.active
  - profiles.active
    Kullanım şekli:
    gradle cleanAll docker -Dspring.profiles.active=tasks
- dockerPush
  Remote docker repository'e image oluşturup göndermeyi sağlamaktadır.
  Parametreler:
  - spring.profiles.active
  - profiles.active
    Kullanım şekli:
    gradle cleanAll dockerPush -Dprofiles.active=general

Ide üzerinden kullanımı

Proje içerisinde örnek kullanım şekli:

settings.gradle kullanımı

gradle.ext {
    // Environment
    environment = [
            java    : [
                    sourceCompatibility: 17,
                    targetCompatibility: 17
            ],
            gradle  : [
                    info: '7.6.1'
            ],
            encoding: [
                    type: 'UTF-8'
            ],
            maven   : [
                    settingsXmlFilePath: System.getProperty("user.home") + '/.m2/settings.xml'
            ],
            docker  : [
                    settingsXmlFilePath: System.getProperty("user.home") + '/.docker/settings.xml'
            ],
            project : [
                    publishingInfo              : [
                            release_gonexus : [versionSuffix: '',
                                               name         : 'kovan-nexus-supervisor',
                                               url          : 'http://nexus.bulut.ai/repository/kovan-releases/'],
                            snapshot_gonexus: [versionSuffix: '-SNAPSHOT',
                                               name         : 'kovan-nexus-snapshots',
                                               url          : 'http://nexus.bulut.ai/repository/kovan-snapshots/'],
                    ],
                    repositoriesInfo            : [
                            online : [[url: ['https://repo.spring.io/release/'
                                             , 'https://repo.spring.io/snapshot/'
                                             , 'https://repo.spring.io/libs-release/'
                                             , 'https://repo.spring.io/libs-milestone-local/'
                                             , 'https://repo.spring.io/libs-release-local/'
                                             , 'https://repo.maven.apache.org/maven2/'
                                             , 'https://repo.spring.io/milestone/'
                                             , 'https://repo.gradle.org/gradle/libs-releases-local/'
                                             , 'https://jcenter.bintray.com/'
                                             , 'https://mvnrepository.com/artifact/'
                                             , 'https://plugins.gradle.org/m2/'
                                             , 'http://jaspersoft.jfrog.io/jaspersoft/third-party-ce-artifacts/'
                                             , 'http://jasperreports.sourceforge.net/maven2']]],
                            gonexus: [[name: 'kovan-nexus-dev',
                                       url : ['http://nexus.bulut.ai/repository/kovan-group/']]],
                    ],
                    buildscriptRepositoriesInfo : [
                            gonexus: ['http://nexus.bulut.ai/repository/framework-plugin-group/']
                    ],
                    dockerPublishingInfo        : [
                            harbor: [name: 'framework-harbor-master',
                                     url : '10.150.0.131/framework']
                    ],
                    publishingScope             : 'release_gonexus',
                    repositoriesScope           : 'gonexus',
                    buildscriptRepositoriesScope: 'gonexus',
                    dockerPublishingScope       : 'harbor'
            ]
    ]
}

build.gradle kullanımı

hvlSpring {
    profile {
        enabled = true
        info = [
                'general': [
                        archiveName: 'general-server', // Oluşacak jar ismi
                        name       : project(':general').name,
                        version    : project(':general').version,
                        buildArgs  : ['RESOURCE_JAR_FILE': project(':general').name, 'CONTAINER_JAR_FILE': project(':general').name], // Dockerfile parametreleri
                        project    : [project(':general')],
                        'tasks'    : [
                                archiveName: 'tasks-server',
                                name       : project(':tasks').name,
                                version    : project(':tasks').version,
                                buildArgs  : ['RESOURCE_JAR_FILE': project(':tasks').name, 'CONTAINER_JAR_FILE': project(':tasks').name],
                                project    : [project(':tasks')]]
                ]
        ]
    }

    docker {
        settingsXmlFilePath = gradle.environment.docker.settingsXmlFilePath
        archiveName = project.name
        version = project.version
        buildArgs = ['RESOURCE_JAR_FILE': archiveName, 'CONTAINER_JAR_FILE': archiveName]
        publishing {
            info = gradle.environment.project.dockerPublishingInfo
            scope = gradle.environment.project.dockerPublishingScope
        }
    }
}