Maven POM nedir? ne işe yarar? nasıl kullanılır?

Apache Maven projelerinde karşınıza çıkan POM (Project Object Model) yani türkçe karşılığı “Proje Nesne Modeli”, Maven için basit temel birimdir, Apache Mavn projelerinin yapılandırma dosyasıdır. POM, “xml” uzantılı bir dosyadır, içerisinde Maven tarafından derlenen projeninin kullandığı proje ve yapılandırma detayları hakkında bilgiler içerir. pom.xml içerisindeki temel anahtar elementlerin bazılarının Türkçe açıklamaları aşağıdaki gibidir. project : “Project” proje anlamındadır. pom.xml dosyasının en üst kök elemanıdır. Örnek bir yapı şöyledir. [code language=”xml”] <project> <modelVersion></modelVersion> <groupId></groupId> <artifactId></artifactId> <version></version> </project> [/code] Örnek kullanımı: [code lang=”xml”] <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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>net.yazilimcity.b2b</groupId> <artifactId>ycnb2b</artifactId> <version>0.0.1-SNAPSHOT</version> <name>YCN B2B</name> </project> [/code] modelVersion: “modelVersion” model versiyonu anlamındadır. Kullanılan POM versiyonunu belirtir. Örneğin, “4.0.0” Kullanım Örneği: [code lang=”xml”] <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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>net.yazilimcity.b2b</groupId> <artifactId>ycnb2b</artifactId> <version>0.0.1-SNAPSHOT</version> <name>YCN B2B</name> </project> [/code] groupId: “groupId” grup kimliği anlamındadır. Maven projesini yapan birimin tekil kullanıcı kimliği bilgisidir. Örnek olarak şöyle bir tekil kimlik verilebilir; “net.yazilimcity” Kullanım Örneği: [code lang=”xml”] <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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>net.yazilimcity.b2b</groupId> <artifactId>ycnb2b</artifactId> <version>0.0.1-SNAPSHOT</version> <name>YCN B2B</name> </project> [/code] artifactId: “artifactId” yapı kimliği anlamındadır. Oluşturulan ana yapının ya da alt modüllerin tekil adını ifade eder. Örnek olarak “my-special-app” veya “my-special-app-ui” Kullanım Örneği: [code lang=”xml”] <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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>net.yazilimcity.b2b</groupId> <artifactId>ycnb2b</artifactId> <version>0.0.1-SNAPSHOT</version> <name>YCN B2B</name> </project> [/code] version: “version” sürümü ifade eder. Projenin veya modülün sürüm bilgisini belirtir. Örneği, “15.9.0” Kullanım Örneği: [code lang=”xml”] <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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>net.yazilimcity.b2b</groupId> <artifactId>ycnb2b</artifactId> <version>0.0.1-SNAPSHOT</version> <name>YCN B2B</name> </project> [/code] packaging: “packaging” paketleme anlamındadır. Paketleme türünü belirtir. Örneğin, “jar”,”pom”,”war” veya “ear” gibi. Kullanım Örneği: [code lang=”xml”] <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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>net.yazilimcity.b2b</groupId> <artifactId>ycnb2b</artifactId> <version>0.0.1-SNAPSHOT</version> <name>YCN B2B</name> <packaging>pom</packaging> </project> [/code] name: “name” ad anlamındadır. Projenin adını ifade eder. Örneği “KINIK Management and Communication”. Kullanım Örneği: [code lang=”xml”] <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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>net.yazilimcity.b2b</groupId> <artifactId>ycnb2b</artifactId> <version>0.0.1-SNAPSHOT</version> <name>YCN B2B</name> </project> [/code] url: “url” bağlantı adresi anlamındadır. Varsa projenin bulunacağı adresi ifade eder. Örneğin, “http://yazilimcity.net/my-special-app” description: “description” açıklama anlamındadır. Proje veyahutta modül hakkında açıklama girilebilir. Örneğin, “KINIK Package Application” Kullanım Örneği: [code lang=”xml”] <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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>net.yazilimcity.b2b</groupId> <artifactId>ycnb2b</artifactId> <version>0.0.1-SNAPSHOT</version> <name>YCN B2B</name> <description>YCN Bussiness To Bussiness</description> </project> [/code] parent: “parent” modüler yapıda kurulan projelerde, modül’e ait olan pom xml’in içerisinde yer alır. Modülün bağlı olduğu ana projeyi belirtilir. Örnek yapı şöyledir. [code language=”xml”] <project> <parent> <groupId></groupId> <artifactId></artifactId> <version></version> </parent> <modelVersion></modelVersion> <artifactId></artifactId> </project> [/code] Kullanım Örneği: [code lang=”xml”] <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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.1.RELEASE</version> <relativePath /> <!– lookup parent from repository –> </parent> <groupId>net.yazilimcity.b2b</groupId> <artifactId>ycnb2b</artifactId> <version>0.0.1-SNAPSHOT</version> <name>YCN B2B</name> </project> [/code] dependencies: “dependencies” bağımlılıklar anlamındadır. Bağımlılıkların tanımlanabileceği bir konteynerdir. Örnek yapısı: [code lang=”xml”] <dependencies> <dependency></dependency> <dependency></dependency> </dependencies> [/code] dependency: “dependency” bağımlılık anlamındadır. İlgili modülün veya projenin bağımlılığı bulunan başka modül veya projelerin belirtildiği alandır. Örnek yapısı: [code lang=”xml”] <dependency> <groupId></groupId> <artifactId></artifactId> <version></version> </dependency> <dependency> <groupId></groupId> <artifactId></artifactId> </dependency> [/code] Kullanım örneği: [code lang=”xml”] <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>5.0.0.M5</version> </dependency> </dependencies> [/code] Kullanım Örneği: [code lang=”xml”] <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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.1.RELEASE</version> <relativePath /> <!– lookup parent from repository –> </parent> <groupId>net.yazilimcity.b2b</groupId> <artifactId>ycnb2b</artifactId> <version>0.0.1-SNAPSHOT</version> <name>YCN B2B</name> <packaging>pom</packaging> <description>YCN Bussiness To Bussiness</description> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <!– lombok dependency –> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> </dependencies> </project> [/code] exclusions: “exclusions” etiketini hariçler anlamında yorumlayabiliriz. Hariç tutulan bağımlılıkların tanımlanacağı bir konteynerdir. Örneğin yapısı: [code lang=”xml”] <exclusions> <exclusion> </exclusion> <exclusion> </exclusion> </exclusions> [/code] exclude: “exclude” etiketi hariç tutma, çıkarma anlamındadır. Bu etiket ile bağımlılık içerisinde otomatik olarak gelecek olan başka bir bağımlılığı çıkarma yani hariç tutma işlemini gerçekleştirir. Örnek yapısı: [code lang=”xml”] <dependency> <groupId></groupId> <artifactId></artifactId> <version></version> <exclusions> <exclusion> <groupId></groupId> <artifactId></artifactId> </exclusion> </exclusions> </dependency> [/code] Kullanım örneği: [code lang=”xml”] <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>5.0.0.M5</version> <exclusions> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> </dependencies> [/code] modules: “modules” modüller anlamındadır. Modüllerin tanımlanabileceği bir konteynerdir. Örnek yapısı: [code lang=”xml”] <modules> <module></module> <module></module> </modules> [/code] module: “module” modül anlamındadır. Ana proje yani parent pom içerisinde modülleri tanımlamak için kullanılmaktadır. [code language=”xml”] <modules> <module>../my-module</module> <module>web-ui</module> </modules> [/code] Örnek kullanımı: [code lang=”xml”] <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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>net.yazilimcity.b2b</groupId> <artifactId>ycnb2b</artifactId> <version>0.0.1-SNAPSHOT</version> <name>YCN B2B</name> <modules> <module>ycnb2b-sec</module> <module>ycnb2b-maint</module> <module>ycnb2b-cat</module> <module>ycnb2b-core</module> <module>ycnb2b-logist</module> <module>ycnb2b-order</module> <module>ycnb2b-rpt</module> <module>ycnb2b-template</module> <module>ycnb2b-user-mgmt</module> <module>ycnb2b-cms</module> <module>../my-module</module> <module>web-ui</module> </modules> </project> [/code] properties: “properties” özellikler anlamındadır. “properties” elementi içerisinde proje özelliklerine ait bilgiler tanımlanabilir, sonrasında ise pom xml içerisinde gerekli yerlere örneğin 1.9 yazmak yerine ${java.version} yazabilirsiniz. Örnek kullanımı: [code language=”xml”] <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.9</java.version> <startClass>net.yazilimcity.WebUISpringBootApplication</startClass> <!– Spring Boot için @SpringBootApplication kullandığımız sınıf –> </properties> [/code] Zaman damgasını tanımlamak için aşağıdaki gibi bir tanımlama yapmalısınız. [code language=”xml”] <properties> <maven.build.timestamp.format>yyyy-MM-dd’T’HH:mm:ss’Z'</maven.build.timestamp.format> </properties> [/code] Öntanımlı dizin adresleri: POM dosyası içerisinde daha önceden tanımlı olan değerlerden bazılarını aşağıdaki gibi kullanabilirsiniz. “${project.basedir}”: Projenin veya modülün en üst dizinini ifade eder. “${project.build.directory}”: Projenin veya modülün en üst dizininindeki target dizini adresini ifade eder. “classpath:”: Projenin veya modülün içerisindeki /src/main/resources dizinini ifade eder. repository: “repository” depo anlamındadır. Bağımlılıklarımızın hangi depodan temin edileceğini aşağıdaki gibi belirtebiliriz. “repositories” ise repository’lerin tanımlanabileceği bir konteynerdir. Örnek yapı: [code language=”xml”] <repositories> <repository> </repository> </repositories> [/code] Örnek kullanımı: [code lang=”xml”] <repositories> <repository> <id>repo-oss-sonatype</id> <name>oss sonatype</name> <url>https://oss.sonatype.org/content/repositories/snapshots/</url> </repository> </repositories> [/code] build: “build” inşa anlamındadır. İlgili modulünüzü veya projenizi nasıl inşa etmek istediğinizi belirtmenize yarar. Örneğin jar, war veya başka bir dosya formatı ile projem veya modülüm inşa edilsin yani oluşturulsun diye belirtebilirsiniz. Bunun yanında aşağıdaki gibi plugin’leri de kullanarak inşa sırasında örneğin web servis için gerekli olan sınıfların oluşmasını sağlayabilirsiniz. Veya nerede inşa edilmesi, oluşturulacak dosyanın adının ne olacağı, test kaynak dosyasının yerleri gibi farklı özellikler belirtebilirsiniz. [code language=”xml”] <build> <plugins> <plugin> <groupId></groupId> <artifactId></artifactId> </plugin> </plugins> </build> [/code] [code language=”xml”] <build> <directory></directory> <outputDirectory></outputDirectory> <finalName></finalName> <testOutputDirectory></testOutputDirectory> <sourceDirectory></sourceDirectory> <scriptSourceDirectory></scriptSourceDirectory> <testSourceDirectory></testSourceDirectory> <resources> <resource> <directory></directory> </resource> </resources> <testResources> <testResource> <directory></directory> </testResource> </testResources> </build> [/code] Örnek kullanımı: [code lang=”xml”] <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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>net.yazilimcity.b2b</groupId> <artifactId>ycnb2b</artifactId> <version>0.0.1-SNAPSHOT</version> <name>YCN B2B</name> <build> <plugins> <!– Package as an executable jar –> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project> [/code] plugin: “plugin” etiketi ile eklentiler belirleyip bu eklentilerin mvn clean install komutu sonrası ne yapması gerektiğini belirleyebilirsiniz. Apach CXF plugin: Aşağıdaki Apache CXF plugin ile SOAP Client(consumer) sınıfları oluşturabilirsiniz yani WSDL için gerekli olan sınıflarını içeri alabilirsiniz. [code lang=”xml”] <build> <!– if don’t using Build Automatically pluginManagement tag not necessary. With this tag mvn generate-sources not working–> <!– <pluginManagement> –> <plugins> <!– cxf-codegen-plugin –> <plugin> <groupId>org.apache.cxf</groupId> <artifactId>cxf-codegen-plugin</artifactId> <version>${cxf.version}</version> <executions> <execution> <id>generate-sources</id> <phase>generate-sources</phase> <configuration> <sourceRoot>${project.build.directory}/generated/cxf</sourceRoot> <wsdlOptions> <wsdlOption> <wsdl>${project.basedir}/src/main/resources/wsdl/zb2b_wb_srv_bind.wsdl</wsdl> <wsdlLocation>classpath:wsdl/zb2b_wb_srv_bind.wsdl</wsdlLocation> <extraargs> <extraarg>-client</extraarg> <extraarg>-impl</extraarg> <extraarg>-validate</extraarg> <extraarg>-autoNameResolution</extraarg> <extraarg>-verbose</extraarg> <extraarg>-defaultValues</extraarg> </extraargs> </wsdlOption> </wsdlOptions> </configuration> <goals> <goal>wsdl2java</goal> </goals> </execution> </executions> </plugin> </plugins> <!– </pluginManagement> –> </build> [/code] maven-jaxb2-plugin: Aşağıdaki maven-jaxb2-plugin ile SOAP Client(consumer) sınıfları oluşturabilirsiniz yani WSDL için gerekli olan sınıflarını içeri alabilirsiniz. [code lang=”xml”] <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <plugin> <groupId>org.jvnet.jaxb2.maven2</groupId> <artifactId>maven-jaxb2-plugin</artifactId> <version>0.14.0</version> <executions> <execution> <id>sap-jaxb2-generate</id> <phase>generate-sources</phase> <goals> <goal>generate</goal> </goals> </execution> </executions> <configuration> <schemaDirectory>${project.basedir}/src/main/resources/wsdl</schemaDirectory> <schemaIncludes> <schemaInclude>*.wsdl</schemaInclude> </schemaIncludes> <!– <bindingDirectory>${project.basedir}/src/main/resources/bindings</bindingDirectory> –> <!– <bindingIncludes> –> <!– <bindingInclude>*.xjb</bindingInclude> –> <!– </bindingIncludes> –> <!– <generatePackage>com.example.demo.schemas.polyakeynez</generatePackage> –> <generateDirectory>${project.basedir}/src/main/java</generateDirectory> <readOnly>false</readOnly> <extension>true</extension> <strict>true</strict> <writeCode>true</writeCode> <verbose>true</verbose> <!– <debug>true</debug> –> <args> <arg>-XautoNameResolution</arg> </args> <forceRegenerate>false</forceRegenerate> <removeOldOutput>false</removeOldOutput> <produces> <produce>**/*.*, **/*.java, **/bgm.ser, **/jaxb.properties</produce> </produces> <episodeFile>${project.basedir}/src/main/java/META-INF/sun-jaxb.episode</episodeFile> <episode>true</episode> </configuration> </plugin> </plugins> </build> [/code] Maven Install Plugin: Aşağıdaki maven-install-plugin ile MyProje/lib altındaki bağımlılık dosyasını .m2 altına yükleyebilirsiniz ve dependency hatasını bu şekilde aşabilirsiniz. [code lang=”xml”] <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-install-plugin</artifactId> <version>2.5.2</version> <executions> <execution> <id>install-external</id> <phase>clean</phase> <configuration> <file>${basedir}/lib/sapjco.jar</file> <localRepositoryPath>C:\Users\okinik\.m2\repository</localRepositoryPath> <groupId>com.sap</groupId> <artifactId>sapjco</artifactId> <version>0.0.1</version> <packaging>jar</packaging> <generatePom>true</generatePom> </configuration> <goals> <goal>install-file</goal> </goals> </execution> </executions> </plugin> [/code] profiles: “profiles” profiller anlamındadır. Profillerin tanımlanabileceği bir konteynerdir. Örnek yapısı: [code lang=”xml”] <profiles> <profile></profile> <profile></profile> </profiles> [/code] profile: “profile” profil anlamına gelmektedir. Örneğin bir profil belirleyip ona göre işlem yapmasını sağlayabilirsiniz. Profillere göre farklı build işlemlerini gerçekleşmesini sağlayabilir, uygulamanını özelliklerinin yazıldığı src/main/resources altındaki application.properties dosyasının değilde application.dev.properties veya application.prod.properties dosyasının hangisinin yüklenmesini ve içeriğinin kullanılmasını activation etiketi ile sağlayabilirsiniz. Örnek yapısı: [code lang=”xml”] <profiles> <profile> <id></id> <properties> <activatedProperties></activatedProperties> </properties> <activation> <activeByDefault></activeByDefault> </activation> </profile> <profile> <id></id> <properties> <activatedProperties></activatedProperties> </properties> </profile> </profiles> [/code] profile : [code language=”xml”] <profiles> <profile> <id></id> <activation> <property> <name></name> </property> </activation> <build> <plugins> <plugin> <inherited></inherited> <groupId></groupId> <artifactId></artifactId> <executions> <execution> <id></id> <goals> <goal></goal> </goals> </execution> </executions> </plugin> <plugin> <inherited></inherited> <groupId>s</groupId> <artifactId></artifactId> <executions> <execution> <id></id> <goals> <goal></goal> </goals> </execution> </executions> </plugin> <plugin> <inherited></inherited> <groupId></groupId> <artifactId></artifactId> <configuration> <updateReleaseInfo></updateReleaseInfo> </configuration> </plugin> </plugins> </build> </profile> </profiles> [/code] Kullanım örneği: [code lang=”xml”] <profiles> <profile> <id>dev</id> <properties> <activatedProperties>dev</activatedProperties> </properties> <activation> <activeByDefault>true</activeByDefault> </activation> </profile> <profile> <id>prod</id> <properties> <activatedProperties>prod</activatedProperties> </properties> </profile> </profiles> [/code] pluginRepository : [code language=”xml”] <pluginRepositories> <pluginRepository> <id></id> <name></name> <url></url> <layout></layout> <snapshots> <enabled></enabled> </snapshots> <releases> <updatePolicy></updatePolicy> </releases> </pluginRepository> </pluginRepositories> [/code] reporting : [code language=”xml”] <reporting> <outputDirectory></outputDirectory> </reporting> [/code] For more information please visit this website.]]>

One thought on “Maven POM nedir? ne işe yarar? nasıl kullanılır?

Leave a Reply

Your email address will not be published. Required fields are marked *