Java, SMPP ve Camel
Bu yazıda biraz daha piyasaya yönelik bir uygulama geliştireceğiz. GSM sektörüne yazılım geliştiren her firmanın ürün kataloğunda olan, toplu SMS gönderimi yapan uygulamalar vardır. Bunlar SMPP kullanılarak, farklı noktalara önem verilerek oluşturulur. Bense bu yazıda Camel kullarak, enterprise integration pattern kullanımına önem vererek, benzer bir toplu SMS gönderimi uygulamasının nasıl geliştirilebileceğini anlatacağım.
SMPP Nedir?
SMPP, Short Message Peer-to-Peer, kısa mesaj gönderimi için kullanılan bir haberleşme protokolü. Bunun için sizin bir kısa mesaj servisi merkezine (SMSC, Short Message Service Center) ihtiyacınız vardır. SMSC’nin temel işlevi gönderdiğiniz kısa mesajları saklama ve iletmektir. SMPP protokolünde sadece mesaj göndermeye bilir mesajda alabilirsiniz. Bu tamamen SMSC’nize bağlanırken kullanacağınız haberleşme şekli ile ilgilidir. İsterseniz sadece mesaj gönderebilir, sadece mesaj alabilir ya da hem mesaj gönderebilir hem mesaj alabilirsiniz. Haberleşme şeklinize göre SMPP protokolünün en küçük birimini yani PDU’ları (Protocol Data Unit) doğru şekilde ayarlamalısınız.
SMPP üzerinden bir SMSC ile haberleşirken az çok aşağıdaki adımları uygulamalısınız.
- SMSC ye bağlantı sağlamalı ve bağlantıyı ne şekilde sağlayacağınızı bildirmelisiniz. (bind)
- SMSC ye bağlantı şeklinize uygun içerikler göndermelisiniz (SubmitSM, ReplaceSM, SubmitMultiSM, DataSM)
- SMSC bağlantı şeklinize uygun olarak size yanıt dönecektir. Eğer bağlantınızı yanıt alacak şekilde yapmadıysanız SMSC’nizden yanıt alamazsınız. (DeliverSM, DeliverReceipt)
- Belirli aralıklarla SMSC’nize ayakta olduğunuzu ve herşeyin yolunda gittiğini bildirmelisiniz. Aksi halde SMSC sizin bağlantı bilgilerinizi koparabilir. (EnquireSm)
Tabi bu mesaj tiplerinin hepsi alt tarafta az öcne bahsettiğim şekilde yani PDU olarak taşınmaktadırlar. Kullandığımız kütüphaneler bizden PDU oluşturmasını bir nebze olsun sakladıkları için işimi kolaylaşıyor. Eğer daha önce bir Bulk Sms uygulaması yazdıysanız ya da şirketinizin bu tip bir ürününün bakımını yaptıysanız buraya kadar anlattıklarımı kullanmışsınızdır. Aynı şekilde bu talaplerin gönderilmesinin senkronize edilmesininde ne kadar önemli olduğunu biliyorsunuzdur.
SMPP Kütüphaneleri
Hemen hemen tüm diller için açık kaynak kodlu ya da ücretsiz SMPP kütüphaneleri bulunuyor. SMPP kütüphanesi geliştirmek çok zor olmasa da yine de bazı paralı kütüphaneler de mevcut. Ben bildiklerimden bir kaç örnek vereceğim.
Java: OpenSmpp, JSmpp
C#: Inetlab.Smpp, Jamaa Smpp, EasySmpp, Roamin Smpp
C/C++: Â Smpp-lib
Bunlardan istediğinizi kullanarak yukarıda bahsettiğim aşamaları gerçekleştirebilirsiniz. Benise ağırlıklı olarak OpenSMPP ve JSmpp kullandım. Bu yazıda yapacağım örnekte Camel üzerinden JSmpp kullanacağım.
SMPP Uygulaması Nasıl Test Edilir
Diyelim ki yukarıda bahsettiğim kütüphaneleri kullanarak uygulama geliştirdiniz. Peki nasıl test edeceksiniz? Gidip test için bir SMSC kiralamanız çok saçma olacak. Bu gibi durumlarda test edebileceğiniz konsol ve masaüstü uygulamaları bulunuyor. Özellikle SMPP kütüphanenizi satın aldıysanız (Inetlab.Smpp gibi) size kütüphaneyle birlikte test etmede kullanabileceğiniz bir SMPP sunucusuda veriyor. Ben daha basit, daha kullanışlı ve bedava olan başka bir yol önereceğim.
Logica’nın yani OpenSmpp kütüphanesini geliştiren şirketin bir de SMPP simulasyon uygulaması var. Uygulama çok basit. Uygulamanıza bağlanabilecek kullanıcıları belirliyorsunuz, sonrasında uygulamanızı konsol üzerinden ayağa kaldırıyorsunuz. Uygulamanız ayağa kalktıktan sonra hangi porttan dinleme yapacağınızı belirliyorsunuz ve sunucunuz hazır oluyor. Sonra sunucunuza gelen-giden istekleri konsol üzerinden takip edebiliyorsunuz. Yine aynı şekilde sunucunuza bu zamana kadar gelmiş SMS’leri ve bağlı kullanıcıları listeleyebiliyorsunuz. Hatta isterseniz bağlı olan kullanıcılara mesaj bile gönderebiliyorsunuz. Özetle bir SMSC’nin hemen hemen tüm davranışlarını gerçekleştirebiliyorsunuz.
Bu uygulamaya OpenSmpp’nin sitesinden erişebilirsiniz. Fakat buradan eriştiğinizde uygulamanın tüm bağımlılıklarını falan kendinizin eklemesi gerekiyor. Aynı şekilde main sınıfını falan da aratıp bulmalısınız. Tabi siz bunlarla tek tek uğraşmayın diye ben bunları toplarladım. Bu linkten, uygulamanın toparlanmış haline erişebilirsiniz. start.sh ile uygulamanızı sorunsuz çalıştırabilirsiniz.
Proje
Yazının başında, toplu sms gönderim uygulaması yapacağımızdan bahsetmiştik. Normalde böyle uygulamalarda bir ara yüzden veri girişi alınır ve bu veri girişi veritabanına kaydedilir. Daha sonrasında bir kaç thread bu veritabanını tarayarak veriyi yorumlayıp SMPP protokolü ile SMSC’ye bildirir.
Bu tarz bir akış bir tutorial yazısına sığmayacağından ben sadece core kımını anlatmaya çalışacağım. Yani veritabanından veriler çekilerek otomatik olarak SMSC’ye bildirilecek.
Proje genelinde her zaman olduğu gibi maven kullanacağım. Bunun yanı sıra veri tabanından polling işlemi için Camel’ın JPA bileşenini, veritabanından çekilen bilgilerin SMSC’ye gönderimi için ise yine Camel’in SMPP bileşenini kullanacağım. Tabi tüm bu JPA ve servislerle, Camel’ı bağlamak için Spring kullanacağım.
Ne yazık ki arayüz olarak bişey kullanmayacağım. Uygulama ayağa kalkarken import.sql içerisindekileri veritabanına kaydedecek, daha sonradan veritabanından okunan bilgiler camel yardımı ile SMSC’ye bildirilecek. Ama inanıyorum ki arayüz eklemek isterseniz de bunu yapmanız çok zaman almayacak.
Diğer projelerimden farklı olarak bunda maven assembly plugin’ini kullanacağım ki uygulamayı evde ya da iş yerinde kullanmak isteyen olursa, rahatlıkla kullanabilsin. Yine yazının uzunluğunu azaltmak adına diğer projelerimde ki gibi satır satır ne yaptığımı yazmayacağım. Sadece ana hatlarıyla ne yaptığımı yazacağım.
Maven
Projeden kısaca bahsettiÄŸimize göre Maven ile projeyi oluÅŸturmaya baÅŸlayabiliriz. Maven ile, maven-archetype-quickstart archetpye’ını kullanarak projemizi oluÅŸturuyoruz. Benim örneÄŸi yaparken kullandığım diÄŸer bilgiler aÅŸağıdaki gibidir. Eskiden projeleri oluÅŸtururken önce maven ile projeyi oluÅŸturup sonra eclipse’e eklerdim. Fakat ÅŸimdi bunu yapmama gerek yok. Intellij’in maven özelliÄŸi çok baÅŸarılı.
- Group Id: com.bahadirakin
- Artifact Id:Â simple-smpp-routing
- Package: com.bahadirakin
pom.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 | <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.bahadirakin</groupId> <artifactId>simple-smpp-routing</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <name>simple-smpp-routing</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.java.version>1.6</project.java.version> <!-- Versions --> <slf4j.version>1.7.5</slf4j.version> <spring.version>4.0.5.RELEASE</spring.version> <hibernate.version>4.2.13.Final</hibernate.version> <hibernate-jpa.version>1.0.1.Final</hibernate-jpa.version> <mysql.version>5.1.30</mysql.version> <typetools.version>0.3.0</typetools.version> <postgresql.version>9.3-1101-jdbc4</postgresql.version> <h2.version>1.3.176</h2.version> <camel.version>2.12.3</camel.version> </properties> <build> <!-- Compiler --> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>${project.java.version}</source> <target>${project.java.version}</target> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.3.1</version> <configuration> <excludes> <exclude>**/conf/*</exclude> <exclude>**/bin/*</exclude> <exclude>**/logback.xml</exclude> <exclude>**/import.sql</exclude> </excludes> </configuration> </plugin> <plugin> <artifactId>maven-assembly-plugin</artifactId> <version>2.3</version> <configuration> <descriptor>assembly.xml</descriptor> <outputDirectory>${project.build.directory}</outputDirectory> <finalName>${project.artifactId}-${project.version}</finalName> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> </plugins> </build> <dependencies> <!-- LOGGING DEPENDENCIES --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-ext</artifactId> <version>${slf4j.version}</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.0.13</version> </dependency> <!-- Spring Dependencies --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>${spring.version}</version> </dependency> <!-- Camel Dependencies --> <dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-core</artifactId> <version>{camel.version}</version> </dependency> <dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-spring</artifactId> <version>${camel.version}</version> <exclusions> <exclusion> <artifactId>commons-logging</artifactId> <groupId>commons-logging</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-jpa</artifactId> <version>${camel.version}</version> </dependency> <dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-smpp</artifactId> <version>${camel.version}</version> </dependency> <!-- JPA Dependencies --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> <version>${hibernate.version}</version> </dependency> <dependency> <groupId>org.hibernate.javax.persistence</groupId> <artifactId>hibernate-jpa-2.0-api</artifactId> <version>${hibernate-jpa.version}</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-c3p0</artifactId> <version>${hibernate.version}</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-ehcache</artifactId> <version>${hibernate.version}</version> </dependency> <!-- Database Dependencies --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.version}</version> <scope>runtime</scope> </dependency> <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <version>${postgresql.version}</version> <scope>runtime</scope> </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <version>${h2.version}</version> <scope>runtime</scope> </dependency> <!-- Test Engine Dependencies --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> </dependencies> </project> |
JPA Katmanı
Jpa katmanımızda çok bişey olmayacak. Sadece JPA entity mizi tanımlayacağız. Doğruca import.sql ve camel kullanacağımızdan bir Dao yada Service katmanına ihtiyacımız olmayacak. Fakat yine de spring içerisinde persistence context tanımlarının yapılması gerekiyor. Nasıl yapıldığına aşağıdaki kaynak kodlardan bakabilir, detaylarına ise spring-jpa yazısından bakabilirsiniz.
ShortMessage.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 | package com.bahadirakin.entities; import javax.persistence.*; import java.io.Serializable; /** * Created by bhdrkn on 14/11/14. */ @Entity @Table(name="ShortMessage") public class ShortMessage implements Serializable { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; @Version private Long version; private String sourceAddress; private Byte sourceTon; private Byte sourceNpi; private String destinationAddress; private Byte destinationTon; private Byte destinationNpi; private String message; private Byte priorityFlag; public ShortMessage() { } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public Long getVersion() { return version; } public void setVersion(Long version) { this.version = version; } public String getSourceAddress() { return sourceAddress; } public void setSourceAddress(String sourceAddress) { this.sourceAddress = sourceAddress; } public Byte getSourceTon() { return sourceTon; } public void setSourceTon(Byte sourceTon) { this.sourceTon = sourceTon; } public Byte getSourceNpi() { return sourceNpi; } public void setSourceNpi(Byte sourceNpi) { this.sourceNpi = sourceNpi; } public String getDestinationAddress() { return destinationAddress; } public void setDestinationAddress(String destinationAddress) { this.destinationAddress = destinationAddress; } public Byte getDestinationTon() { return destinationTon; } public void setDestinationTon(Byte destinationTon) { this.destinationTon = destinationTon; } public Byte getDestinationNpi() { return destinationNpi; } public void setDestinationNpi(Byte destinationNpi) { this.destinationNpi = destinationNpi; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public Byte getPriorityFlag() { return priorityFlag; } public void setPriorityFlag(Byte priorityFlag) { this.priorityFlag = priorityFlag; } @Override public String toString() { return message; } } |
Camel Katmanı
Tüm işin yapıldığı yer aslında Camel katmanı. Burada iki tip endpoint oluşturmamız gerekiyor.
- JPA Endoint: JPA için endpoint oluştururken, okuma işlemlerini ne şekilde yapacağımıza, okuma yaparken tablomuzu ne şekilde kitleyeceğimize, okuma yaptıktan sonra veritabanındaki veriyi ne yapacağımıza kadar bir çok şeye karar verebiliyoruz. Hangi sorguyla polling yapacağımızı, persistence context içerisinde tanımlı entity’lerimizden hangisi için polling yapacağımızı seçebiliyoruz. Daha ayrıntılı bilgi için camel jpa bileşeninin sayfasını inceleyebilirsiniz.
- SMPP Endpoint: SMPP host adresini, port bilgilerini, smpp kullanacak kullanıcı bilgilerini, smpp ile hangi şekilde haberleşeceğimizi ve daha bir çok bilgiyi bu katmanda veriyoruz. Bizim tek yapacağımız veritabanından kısa mesaj bilgilerini okuyup SMSC’ye bildirmek olacağından biz sadece consumer (yani transmitter) olarak bağlanıyoruz. Aynı şekilde kaç dakikada bir ayakta kontrolü yapacağımızı da belirleyebiliyoruz. Daha ayrıntılı bilgi için camel smpp bileşeninin sayfasını inceleyebilirsiniz.
camelContext.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:camel="http://camel.apache.org/schema/spring" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd "> <camel:camelContext xmlns="http://camel.apache.org/schema/spring"> <camel:endpoint id="jpaEndpoint" uri="jpa:com.bahadirakin.entities.ShortMessage?persistenceUnit=default&consumeDelete=${polling.consumeDelete}&consumeLockEntity=${polling.consumeLockEntity}&flushOnSend=${polling.flushOnSend}&maximumResults=${polling.maximumResults}&consumer.delay=${polling.consumer.delay}&consumer.initialDelay=${polling.consumer.initialDelay}&consumer.lockModeType=${polling.consumer.lockModeType}&transactionManager=#transactionManager&consumer.query=select m from com.bahadirakin.entities.ShortMessage m" /> <camel:endpoint id="smppEndpoint" uri="smpp://${smpp.username}@${smpp.host}:${smpp.port}?password=${smpp.password}&systemType=${smpp.systemType}&dataCoding=${smpp.dataCoding}&alphabet=${smpp.alphabet}&encoding=${smpp.encoding}&enquireLinkTimer=${smpp.enquireLinkTimer}&initialReconnectDelay=${smpp.initialReconnectDelay}&reconnectDelay=${smpp.reconnectDelay}&serviceType=${smpp.serviceType}&sourceAddr=${smpp.sourceAddr}&sourceAddrTon=${smpp.sourceAddrTon}&sourceAddrNpi=${smpp.sourceAddrNpi}&priorityFlag=${smpp.priorityFlag}" /> <camel:route id="route"> <camel:from ref="jpaEndpoint"/> <camel:choice> <camel:when> <camel:simple>${in.body.sourceAddress} != null</camel:simple> <camel:setHeader headerName="CamelSmppSourceAddr"> <camel:simple>${in.body.sourceAddress}</camel:simple> </camel:setHeader> </camel:when> </camel:choice> <camel:choice> <camel:when> <camel:simple>${in.body.sourceTon} != null</camel:simple> <camel:setHeader headerName="CamelSmppSourceAddrTon"> <camel:simple resultType="java.lang.Byte">${in.body.sourceTon}</camel:simple> </camel:setHeader> </camel:when> </camel:choice> <camel:choice> <camel:when> <camel:simple>${in.body.sourceNpi} != null</camel:simple> <camel:setHeader headerName="CamelSmppSourceAddrNpi"> <camel:simple resultType="java.lang.Byte">${in.body.sourceNpi}</camel:simple> </camel:setHeader> </camel:when> </camel:choice> <camel:setHeader headerName="CamelSmppDestAddr" > <camel:simple>${in.body.destinationAddress}</camel:simple> </camel:setHeader> <camel:setHeader headerName="CamelSmppDestAddrTon"> <camel:simple resultType="java.lang.Byte">${in.body.destinationTon}</camel:simple> </camel:setHeader> <camel:setHeader headerName="CamelSmppDestAddrNpi"> <camel:simple resultType="java.lang.Byte">${in.body.destinationNpi}</camel:simple> </camel:setHeader> <camel:choice> <camel:when> <camel:simple>${in.body.priorityFlag} != null</camel:simple> <camel:setHeader headerName="CamelSmppPriorityFlag"> <camel:simple resultType="java.lang.Byte">${in.body.priorityFlag}</camel:simple> </camel:setHeader> </camel:when> </camel:choice> <camel:convertBodyTo type="java.lang.String" /> <camel:to ref="smppEndpoint" /> </camel:route> </camel:camelContext> </beans> |
Uygulamanın Paketlenmesi
Biz bir konsol uygulaması geliştirdik, uygulamamızı rahatça dağıtabilmek için .zip halinde paketleyebiliriz. Aynı şekilde hangi klasörde bağımlılıklarımızın olacağına, hangi klasörde başlatma sciptlerinin olacağına karar verebiliriz. Aynı şekilde dışarıdan değiştirmek isteyeceğimiz ayarlarımızı ve import.sql dosyamızı jar içerisine değil de zip içerisine koyup dağıtmalıyız ki rahatça değiştirilebilsin.
Bunun için maven’ın assembly pluginini kullanıyoruz. Zaten yukarıda verdiğim pom.xml içerisinde de dikkatinizi çekmiştir. Ek olarak bir assembly.xml dosyasına ihtiyaç duyuyor. Biz plugin’i ayarlarken pom.xml ile aynı seviyede olacak şekilde ayarladığımızdan pom.xml dosyasının yanına yeni bir assembly.xml dosyası yaratıyoruz ve içeriğini aşağıdaki gibi yapıyoruz.
assembly.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | <assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd"> <id>bin</id> <formats> <format>zip</format> </formats> <fileSets> <fileSet> <directory>${project.basedir}/src/main/resources/conf</directory> <outputDirectory>/conf</outputDirectory> <includes> <include>*.properties</include> <include>*.xml</include> </includes> </fileSet> <fileSet> <directory>${project.basedir}/src/main/resources/bin</directory> <outputDirectory>/</outputDirectory> <includes> <include>*.sh</include> <include>*.bat</include> </includes> </fileSet> <fileSet> <directory>${project.basedir}/src/main/resources</directory> <outputDirectory>/</outputDirectory> <includes> <include>logback.xml</include> <include>import.sql</include> </includes> </fileSet> </fileSets> <dependencySets> <dependencySet> <outputDirectory>/lib</outputDirectory> <excludes> <exclude>${project.groupId}:${project.artifactId}</exclude> </excludes> </dependencySet> <dependencySet> <outputDirectory>/</outputDirectory> <includes> <include>${project.groupId}:${project.artifactId}</include> </includes> </dependencySet> </dependencySets> <includeBaseDirectory>false</includeBaseDirectory> </assembly> |
Son
Uygulamayı zip dosyasından çıkarıp ana dizindeki run.sh ya da run.bat dosyasını kullanarak çalıştırabiliriz. Eğer ayarlarında bir değişiklik yapmadıysanız H2 veritabanı yaratıp, import.sql dosyasının içerisindekileri bu veritabanına kaydedecektir. Uygulamayı istediğiniz veritabanını kullanacak şekilde ayarlayabilirsiniz. Bu gibi durumlarda import.sql içerisindeki verileri ilgili veritabanına göre değiştirmeniz gerekebilir. Son bir uyarı daha unutmayın import.sql dosyası sadece create ya da create-drop modunda çalışır. Son olarak belirteyim, uygulamanın genelinin import.sql üzeirnden kullanılmasından ziyade, test edilmesi düşünüldü. Yarın başka bir arayüzde veritabanına insert atılacağı varsayılmıştır.
Uygulamanın kaynak kodlarına aşağıdaki adresten erişebilirsiniz.
End Of Line