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:
Buildscript kullanımı
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:
- 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. AlanCaseFormat.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ğindevice_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çilenEntity 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çindenLookup
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 yolgeneratePackage
görevinin her çalıştırılmasında silinir. Çıkarılan dosyaların tamamı yada kullanılmak istenilenlerisrc/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:
Buildscript kullanımı
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:
- https://docs.jboss.org/hibernate/orm/5.2/topical/html_single/bytecode/BytecodeEnhancement.html
- http://devdoc.net/javaweb/hibernate/Hibernate-5.1.0/userGuide/en-US/html/ch03.html
- https://dzone.com/articles/hibernate-bytecode-enhancement-association-managem
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:
Buildscript kullanımı
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ğerapplication-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:
Buildscript kullanımı
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.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:
- 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);
}
- generateMapStructMapper task'ı kullanılarak Mapper'lar otomatik oluşturulur.
- 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;
}
}
- 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
- https://mapstruct.org/documentation/reference-guide/
- https://mapstruct.org/documentation/stable/reference/html/
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.
build.gradle dosyası içerisindeki extensionda aşağıdaki gibi ayarlama yapılmalıdır.
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:
Buildscript kullanımı
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:
Buildscript kullanımı
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:
Buildscript kullanımı
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
}
}
}