Maven pom.xml

Alican Akkuş bio photo By Alican Akkuş Comment

Merhaba arkadaslar, bu yazımızda Maven için en önemli bir konu olan POM’dan bahsedeceğiz.

POM(Project Object Model)

POM, xml dosya formatında olan ve bir projenin build edilmesinden, nasıl edileceğine, bağımlılıklarından, packagingine kadar proje ile ilgili olan her türlü bilgiyi içerisinde barındıran bir dosyadır. Maven’in son versionunda pom.xml olarak adlandırılır, önceki versionlarında farklı isimlendirmeler vardı.

POM’un projenin base directory’sinde bulunması gerekir.

Örnek bir pom’a bakalım;

<?xml version="1.0" encoding="UTF-8"?>
<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.wora</groupId>
	<artifactId>caysever-app</artifactId>
	<version>1.0.0</version>
</project>

Pom’da olması zorunlu olan groupId, artifactId ve version’dur, bunları proje olusturma aşamasında zaten set ediyoruz. Version default olarak 1.0.0-SNAPSHOT’dır. GroupId -> company name, articactId -> project name’dir.

Projemiz eğer maven repo’sunda bulunuyor ise şu şekilde erişilebilir olacak; MAVEN_REPO/com/wora/caysever-app/1.0.0/caysever-app-1.0.0.jar

Maven, proje ve/veya uygulamaları unique identifier olarak tanımlamak için groupId, artifactId, version ve packaging ifadelerini kullanarak sağlar. Eğer tüm bu değerler aynı ise iki proje çakışacaktır ve hangisini kullandım vs gibi sıkıntılar oluşacaktır.

Proje unique syntaxı şu şekilde oluşturulur (GAV) -> groupId:artifactId:version

Tekilliği sağlarken GAV’a göre sağlar eğer yetersiz olursa packagingdeki paket type(jar, war) ile sağlamaya çalışır.

POM içerisinde kullanabilecegimiz bazı tag’lere bakalım;

  • packaging : Paketleme tipini belirtir, default olarak jar’dır. Jar, War, Rar vs gibi tipler kullanılabilir.
  • name : Projeye isim vermek içindir. Verilmesinden yanayım.
  • url : Proje’nin adres niteliğindedir.
  • dependencies : Uygulama bağımlılıklarının tanımlandığı kısımdır.
  • scope : Proje ortamını belirler, compile, test, runtime olabilir.
  • properties, mailingList, parent vb gibi kısımlara ilerleyen zamanlarda yazılar içerisinde değinecegim.

Örnekle bakalım;

<?xml version="1.0" encoding="UTF-8"?>
<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/maven-v4_0_0.xsd">

	<modelVersion>4.0.0</modelVersion>

	<groupId>com.wora</groupId>
	<artifactId>caysever-app</artifactId>
	<packaging>jar</packaging>
	<version>1.0.0</version>

	<name>caysever-app @javaman</name>
	<url>alicanakkus.com</url>

	<developers>
		<developer>
			<id>caysever</id>
			<name>AlicanAkkus</name>
			<email>aakkus@alicanakkus.com</email>
			<url>http://alicanakkus/about</url>
			<roles>
				<role>developer</role>
			</roles>
		</developer>
	</developers>

	<dependencies>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>3.8.1</version>
			<scope>test</scope>
		</dependency>
	</dependencies>
</project>

Dependency olarak test için junit ekledik, name ve url bilgisi verdik.

Not : Her proje için tek bir tane pom bulunmalıdır.

Super POM

Her Maven POM’u super pom’dan inherit edilir. Özel olarak belirtilmemişse default olarak Base POM’dan inherit edilir.

Süper pom baya uzun yer vermedim bu nedenle ama şuradan erişebilirsiniz : super pom

Ayrıca maven, effective-pom da kullanır build etmek icin. Effective pom ve süper pom da her ikisi, geliştiricilerin kendi pom’larında daha az configürasyon ve düzenleme yapmalarını sağlamak içindir.

super pom

Örneğin yukarıdaki pom’a göre effective pom şu şekilde oluşacaktır;

<?xml version="1.0"?>
<project
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
	xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.wora</groupId>
	<artifactId>caysever-app</artifactId>
	<version>1.0.0</version>
	<name>caysever-app @javaman</name>
	<url>alicanakkus.com</url>
	<developers>
		<developer>
			<id>caysever</id>
			<name>AlicanAkkus</name>
			<email>aakkus@alicanakkus.com</email>
			<url>http://alicanakkus/about</url>
			<roles>
				<role>developer</role>
			</roles>
		</developer>
	</developers>
	<dependencies>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>3.8.1</version>
			<scope>test</scope>
		</dependency>
	</dependencies>
	<repositories>
		<repository>
			<snapshots>
				<enabled>false</enabled>
			</snapshots>
			<id>central</id>
			<name>Central Repository</name>
			<url>http://repo.maven.apache.org/maven2</url>
		</repository>
	</repositories>
	<pluginRepositories>
		<pluginRepository>
			<releases>
				<updatePolicy>never</updatePolicy>
			</releases>
			<snapshots>
				<enabled>false</enabled>
			</snapshots>
			<id>central</id>
			<name>Central Repository</name>
			<url>http://repo.maven.apache.org/maven2</url>
		</pluginRepository>
	</pluginRepositories>
	<build>
		<sourceDirectory>/data/workspace_myself/caysever-app/src/main/java</sourceDirectory>
		<scriptSourceDirectory>/data/workspace_myself/caysever-app/src/main/scripts</scriptSourceDirectory>
		<testSourceDirectory>/data/workspace_myself/caysever-app/src/test/java</testSourceDirectory>
		<outputDirectory>/data/workspace_myself/caysever-app/target/classes</outputDirectory>
		<testOutputDirectory>/data/workspace_myself/caysever-app/target/test-classes</testOutputDirectory>
		<resources>
			<resource>
				<directory>/data/workspace_myself/caysever-app/src/main/resources</directory>
			</resource>
		</resources>
		<testResources>
			<testResource>
				<directory>/data/workspace_myself/caysever-app/src/test/resources</directory>
			</testResource>
		</testResources>
		<directory>/data/workspace_myself/caysever-app/target</directory>
		<finalName>caysever-app-1.0.0</finalName>
		<pluginManagement>
			<plugins>
				<plugin>
					<artifactId>maven-antrun-plugin</artifactId>
					<version>1.3</version>
				</plugin>
				<plugin>
					<artifactId>maven-assembly-plugin</artifactId>
					<version>2.2-beta-5</version>
				</plugin>
				<plugin>
					<artifactId>maven-dependency-plugin</artifactId>
					<version>2.1</version>
				</plugin>
				<plugin>
					<artifactId>maven-release-plugin</artifactId>
					<version>2.0</version>
				</plugin>
			</plugins>
		</pluginManagement>
		<plugins>
			<plugin>
				<artifactId>maven-clean-plugin</artifactId>
				<version>2.4.1</version>
				<executions>
					<execution>
						<id>default-clean</id>
						<phase>clean</phase>
						<goals>
							<goal>clean</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
			<plugin>
				<artifactId>maven-install-plugin</artifactId>
				<version>2.3.1</version>
				<executions>
					<execution>
						<id>default-install</id>
						<phase>install</phase>
						<goals>
							<goal>install</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
			<plugin>
				<artifactId>maven-resources-plugin</artifactId>
				<version>2.5</version>
				<executions>
					<execution>
						<id>default-resources</id>
						<phase>process-resources</phase>
						<goals>
							<goal>resources</goal>
						</goals>
					</execution>
					<execution>
						<id>default-testResources</id>
						<phase>process-test-resources</phase>
						<goals>
							<goal>testResources</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
			<plugin>
				<artifactId>maven-surefire-plugin</artifactId>
				<version>2.10</version>
				<executions>
					<execution>
						<id>default-test</id>
						<phase>test</phase>
						<goals>
							<goal>test</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
			<plugin>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>2.3.2</version>
				<executions>
					<execution>
						<id>default-testCompile</id>
						<phase>test-compile</phase>
						<goals>
							<goal>testCompile</goal>
						</goals>
					</execution>
					<execution>
						<id>default-compile</id>
						<phase>compile</phase>
						<goals>
							<goal>compile</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
			<plugin>
				<artifactId>maven-jar-plugin</artifactId>
				<version>2.3.2</version>
				<executions>
					<execution>
						<id>default-jar</id>
						<phase>package</phase>
						<goals>
							<goal>jar</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
			<plugin>
				<artifactId>maven-deploy-plugin</artifactId>
				<version>2.7</version>
				<executions>
					<execution>
						<id>default-deploy</id>
						<phase>deploy</phase>
						<goals>
							<goal>deploy</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
			<plugin>
				<artifactId>maven-site-plugin</artifactId>
				<version>3.0</version>
				<executions>
					<execution>
						<id>default-site</id>
						<phase>site</phase>
						<goals>
							<goal>site</goal>
						</goals>
						<configuration>
							<outputDirectory>/data/workspace_myself/caysever-app/target/site</outputDirectory>
							<reportPlugins>
								<reportPlugin>
									<groupId>org.apache.maven.plugins</groupId>
									<artifactId>maven-project-info-reports-plugin</artifactId>
								</reportPlugin>
							</reportPlugins>
						</configuration>
					</execution>
					<execution>
						<id>default-deploy</id>
						<phase>site-deploy</phase>
						<goals>
							<goal>deploy</goal>
						</goals>
						<configuration>
							<outputDirectory>/data/workspace_myself/caysever-app/target/site</outputDirectory>
							<reportPlugins>
								<reportPlugin>
									<groupId>org.apache.maven.plugins</groupId>
									<artifactId>maven-project-info-reports-plugin</artifactId>
								</reportPlugin>
							</reportPlugins>
						</configuration>
					</execution>
				</executions>
				<configuration>
					<outputDirectory>/data/workspace_myself/caysever-app/target/site</outputDirectory>
					<reportPlugins>
						<reportPlugin>
							<groupId>org.apache.maven.plugins</groupId>
							<artifactId>maven-project-info-reports-plugin</artifactId>
						</reportPlugin>
					</reportPlugins>
				</configuration>
			</plugin>
		</plugins>
	</build>
	<reporting>
		<outputDirectory>/data/workspace_myself/caysever-app/target/site</outputDirectory>
	</reporting>
</project>

POM hakkında genel olarak söyleyeceklerim bu kadar arkadaslar.

Bir sonraki yazıda görüsmek üzere, esen kalın.

A.Akkus

comments powered by Disqus