<?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>

	<parent>
		<groupId>me.chrissw-r1</groupId>
		<artifactId>build-parent</artifactId>
		<version>3.0.31</version>
	</parent>

	<!-- project identifier -->
	<artifactId>java-parent</artifactId>
	<packaging>pom</packaging>

	<!-- project metadata -->
	<name>Java Parent</name>
	<description>
		Parent of all Java projects by ChrissW-R1
	</description>

	<properties>
		<!-- technically-based properties -->
		<project.module-root.relativedir>${project.parent.relativedir}../</project.module-root.relativedir>
		<java.rootPackage.raw>${project.groupId}.${java.package}</java.rootPackage.raw>
		<mainClass.localPath>Main</mainClass.localPath>
		<mainClass.fullPath>${java.rootPackage.cleaned}.${mainClass.localPath}</mainClass.fullPath>
		<java.filteredSource.dir>${project.build.directory}/filtered-sources/java</java.filteredSource.dir>

		<!-- project-specific properties -->
		<java.package>${project.artifactId}</java.package>
		<obfuscate>true</obfuscate>

		<!-- dependency versions -->
		<jetbrains-annotations.version>26.0.2-1</jetbrains-annotations.version>
		<jcip-annotations.version>1.0-1</jcip-annotations.version>
		<spotbugs.version>4.9.8</spotbugs.version>
		<lombok.version>1.18.42</lombok.version>
		<proguard.annotations.version>7.8.2</proguard.annotations.version>
		<slf4j.version>2.0.17</slf4j.version>
		<junit.minor-version>14.1</junit.minor-version>
		<junit.jupiter.version>5.${junit.minor-version}</junit.jupiter.version>
		<junit.platform.version>1.${junit.minor-version}</junit.platform.version>
		<mockito.version>5.21.0</mockito.version>

		<!-- plugin versions -->
		<plugin.proguard.version>2.7.0</plugin.proguard.version>
		<plugin.spotbugs.version>${spotbugs.version}.2</plugin.spotbugs.version>
		<plugin.surefire.version>3.5.4</plugin.surefire.version>
		<plugin.shade.version>3.6.1</plugin.shade.version>
		<plugin.javadoc.version>3.12.0</plugin.javadoc.version>

		<!-- JavaDoc URLs -->
		<jcip-annotations.javadoc.url>https://javadoc.io/doc/com.google.code.findbugs/annotations/latest</jcip-annotations.javadoc.url>
		<spotbugs.javadoc.url>https://javadoc.io/doc/com.github.spotbugs/spotbugs-annotations/${spotbugs.version}</spotbugs.javadoc.url>
		<lombok.javadoc.url>https://projectlombok.org/api</lombok.javadoc.url>
		<proguard.annotations.javadoc.url>https://javadoc.io/doc/com.guardsquare/proguard-annotations/${proguard.annotations.version}</proguard.annotations.javadoc.url>
		<jetbrains-annotations.javadoc.url>https://javadoc.io/doc/org.jetbrains/annotations/${jetbrains-annotations.version}</jetbrains-annotations.javadoc.url>
		<slf4j.javadoc.url>https://slf4j.org/apidocs</slf4j.javadoc.url>
		<junit.platform.javadoc.url>https://junit.org/junit5/docs/${junit.jupiter.version}/api</junit.platform.javadoc.url>
		<mockito.javadoc.url>https://javadoc.io/doc/org.mockito/mockito-core/${mockito.version}</mockito.javadoc.url>
	</properties>

	<dependencies>
		<!-- build-only dependencies -->
		<dependency>
			<groupId>com.github.stephenc.jcip</groupId>
			<artifactId>jcip-annotations</artifactId>
			<version>${jcip-annotations.version}</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>com.github.spotbugs</groupId>
			<artifactId>spotbugs-annotations</artifactId>
			<version>${spotbugs.version}</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<version>${lombok.version}</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>com.guardsquare</groupId>
			<artifactId>proguard-annotations</artifactId>
			<version>${proguard.annotations.version}</version>
			<scope>provided</scope>
		</dependency>

		<!-- provided dependencies -->
		<dependency>
			<groupId>org.jetbrains</groupId>
			<artifactId>annotations</artifactId>
			<version>${jetbrains-annotations.version}</version>
			<scope>provided</scope>
		</dependency>

		<!-- default dependencies -->
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>${slf4j.version}</version>
		</dependency>

		<!-- test dependencies -->
		<dependency>
			<groupId>org.junit.jupiter</groupId>
			<artifactId>junit-jupiter-engine</artifactId>
			<version>${junit.jupiter.version}</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.junit.jupiter</groupId>
			<artifactId>junit-jupiter</artifactId>
			<version>${junit.jupiter.version}</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.junit.platform</groupId>
			<artifactId>junit-platform-commons</artifactId>
			<version>${junit.platform.version}</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.mockito</groupId>
			<artifactId>mockito-core</artifactId>
			<version>${mockito.version}</version>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<sourceDirectory>${java.filteredSource.dir}</sourceDirectory>
		<resources>
			<resource>
				<directory>src/main/java</directory>
				<filtering>true</filtering>
				<targetPath>${java.filteredSource.dir}</targetPath>
			</resource>
			<resource>
				<directory>src/main/resources</directory>
				<filtering>true</filtering>
			</resource>
			<resource>
				<directory>${project.build.directory}/generated-resources</directory>
				<includes>
					<include>project.properties</include>
				</includes>
				<filtering>true</filtering>
			</resource>
			<resource>
				<directory>${project.basedir}</directory>
				<includes>
					<include>README.md</include>
				</includes>
			</resource>
		</resources>
		<pluginManagement>
			<plugins>
				<plugin>
					<groupId>org.codehaus.mojo</groupId>
					<artifactId>build-helper-maven-plugin</artifactId>
					<executions>
						<execution>
							<id>sanitize-rootpackage-step1</id>
							<phase>initialize</phase>
							<goals>
								<goal>regex-property</goal>
							</goals>
							<configuration>
								<name>java.rootPackage.step1</name>
								<value>${java.rootPackage.raw}</value>
								<regex>[^\w\.]</regex>
								<replacement />
								<failIfNoMatch>false</failIfNoMatch>
							</configuration>
						</execution>
						<execution>
							<id>sanitize-rootpackage-step2</id>
							<phase>initialize</phase>
							<goals>
								<goal>regex-property</goal>
							</goals>
							<configuration>
								<name>java.rootPackage.step2</name>
								<value>${java.rootPackage.step1}</value>
								<regex>\.{2,}</regex>
								<replacement>.</replacement>
								<failIfNoMatch>false</failIfNoMatch>
							</configuration>
						</execution>
						<execution>
							<id>sanitize-rootpackage-step3a</id>
							<phase>initialize</phase>
							<goals>
								<goal>regex-property</goal>
							</goals>
							<configuration>
								<name>java.rootPackage.step3a</name>
								<value>${java.rootPackage.step2}</value>
								<regex>[^a-zA-Z\d]+$</regex>
								<replacement>x</replacement>
								<failIfNoMatch>false</failIfNoMatch>
							</configuration>
						</execution>
						<execution>
							<id>sanitize-rootpackage-step3b</id>
							<phase>initialize</phase>
							<goals>
								<goal>regex-property</goal>
							</goals>
							<configuration>
								<name>java.rootPackage.step3b</name>
								<value>${java.rootPackage.step3a}</value>
								<regex>^[^a-z]</regex>
								<replacement>x</replacement>
								<failIfNoMatch>false</failIfNoMatch>
							</configuration>
						</execution>
						<execution>
							<id>sanitize-rootpackage-finalstep</id>
							<phase>initialize</phase>
							<goals>
								<goal>regex-property</goal>
							</goals>
							<configuration>
								<name>java.rootPackage.cleaned</name>
								<value>${java.rootPackage.step3b}</value>
								<regex>\.[^a-z]</regex>
								<replacement>.x</replacement>
								<failIfNoMatch>false</failIfNoMatch>
							</configuration>
						</execution>
					</executions>
				</plugin>
				<plugin>
					<artifactId>maven-compiler-plugin</artifactId>
					<version>${plugin.compiler.version}</version>
					<configuration>
						<source>${java.version.qualified}</source>
						<target>${java.version.qualified}</target>
					</configuration>
				</plugin>
				<plugin>
					<groupId>com.github.spotbugs</groupId>
					<artifactId>spotbugs-maven-plugin</artifactId>
					<version>${plugin.spotbugs.version}</version>
					<configuration>
						<effort>Max</effort>
						<failOnError>true</failOnError>
						<threshold>Low</threshold>
						<xmlOutput>true</xmlOutput>
						<spotbugsXmlOutputDirectory>${project.build.directory}/spotbugs</spotbugsXmlOutputDirectory>
					</configuration>
				</plugin>
				<plugin>
					<artifactId>maven-surefire-plugin</artifactId>
					<version>${plugin.surefire.version}</version>
				</plugin>
				<plugin>
					<groupId>com.github.wvengen</groupId>
					<artifactId>proguard-maven-plugin</artifactId>
					<version>${plugin.proguard.version}</version>
					<configuration>
						<injarNotExistsSkip>true</injarNotExistsSkip>
						<obfuscate>${obfuscate}</obfuscate>
						<options>
							<!-- control options -->
							<option>-allowaccessmodification</option>
							<option>-keepattributes Signature</option>
							<option>-keepattributes RuntimeVisibleAnnotations</option>

							<!-- keep Java language specific objects -->
							<option>-keepclassmembers class * implements java.io.Serializable { static final long serialVersionUID; }</option>
							<option>-keep class module-info</option>

							<!-- keep JPA specific objects -->
							<option>-keep @jakarta.persistence.Embeddable public class *</option>
							<option>-keep @jakarta.persistence.Entity public class *</option>
							<option>-keepclassmembers @jakarta.persistence.Entity public class * { @jakarta.persistence.Id *; }</option>
							<option>-keepclassmembers @jakarta.persistence.Entity public class * { @jakarta.persistence.EmbeddedId *; }</option>

							<!-- keep main class -->
							<option>-keep public class ${mainClass.fullPath}</option>
							<option>-keepclassmembers public class ${mainClass.fullPath} { public *; }</option>

							<!-- keep annotated objects -->
							<option>-keep @proguard.annotation.Keep public interface *</option>
							<option>-keep @proguard.annotation.Keep public class *</option>
							<option>-keep @proguard.annotation.Keep public enum *</option>
							<option>-keep @proguard.annotation.Keep public @interface *</option>
							<option>-keep @proguard.annotation.KeepPublicClassMembers public interface *</option>
							<option>-keep @proguard.annotation.KeepPublicClassMembers public class *</option>
							<option>-keep @proguard.annotation.KeepPublicClassMembers public enum *</option>
							<option>-keep @proguard.annotation.KeepPublicClassMembers public @interface *</option>
							<option>-keepclassmembers public interface * { @proguard.annotation.Keep public *; }</option>
							<option>-keepclassmembers public class * { @proguard.annotation.Keep public *; }</option>
							<option>-keepclassmembers public enum * { @proguard.annotation.Keep public *; }</option>
							<option>-keepclassmembers public @interface * { @proguard.annotation.Keep public *; }</option>
							<option>-keepclassmembers @proguard.annotation.KeepPublicClassMembers public interface * { public *; }</option>
							<option>-keepclassmembers @proguard.annotation.KeepPublicClassMembers public class * { public *; }</option>
							<option>-keepclassmembers @proguard.annotation.KeepPublicClassMembers public enum * { public *; }</option>
							<option>-keepclassmembers @proguard.annotation.KeepPublicClassMembers public @interface * { public *; }</option>
							<option>-keepnames @proguard.annotation.KeepName public interface *</option>
							<option>-keepnames @proguard.annotation.KeepName public class *</option>
							<option>-keepnames @proguard.annotation.KeepName public enum *</option>
							<option>-keepnames @proguard.annotation.KeepName public @interface *</option>
							<option>-keepclassmembernames public interface * { @proguard.annotation.KeepName *; }</option>
							<option>-keepclassmembernames public class * { @proguard.annotation.KeepName *; }</option>
							<option>-keepclassmembernames public enum * { @proguard.annotation.KeepName *; }</option>
							<option>-keepclassmembernames public @interface * { @proguard.annotation.KeepName *; }</option>
							<option>-keepclassmembernames @proguard.annotation.KeepPublicClassMemberNames public interface * { public *; }</option>
							<option>-keepclassmembernames @proguard.annotation.KeepPublicClassMemberNames public class * { public *; }</option>
							<option>-keepclassmembernames @proguard.annotation.KeepPublicClassMemberNames public enum * { public *; }</option>
							<option>-keepclassmembernames @proguard.annotation.KeepPublicClassMemberNames public @interface * { public *; }</option>
							<option>-keep public class * implements @proguard.annotation.KeepPublicImplementations *</option>
							<option>-keepclassmembers @proguard.annotation.KeepPublicGettersSetters class * { public *** get*(); public *** get*(int); public boolean is*(); public boolean is*(int); public void set*(***); public void set*(int, ***); }</option>
							<option>-keepclasseswithmembers @proguard.annotation.KeepApplication public class * { public static void main(java.lang.String[]); }</option>
						</options>
					</configuration>
				</plugin>
				<plugin>
					<artifactId>maven-javadoc-plugin</artifactId>
					<version>${plugin.javadoc.version}</version>
					<configuration>
						<source>${java.version}</source>
						<keywords>true</keywords>
						<serialwarn>true</serialwarn>
						<links>
							<link>${jcip-annotations.javadoc.url}</link>
							<link>${spotbugs.javadoc.url}</link>
							<link>${lombok.javadoc.url}</link>
							<link>${proguard.annotations.javadoc.url}</link>
							<link>${jetbrains-annotations.javadoc.url}</link>
							<link>${slf4j.javadoc.url}</link>
							<link>${junit.platform.javadoc.url}</link>
							<link>${mockito.javadoc.url}</link>
						</links>
					</configuration>
				</plugin>
			</plugins>
		</pluginManagement>
		<plugins>
			<plugin>
				<groupId>org.codehaus.mojo</groupId>
				<artifactId>build-helper-maven-plugin</artifactId>
			</plugin>
			<plugin>
				<artifactId>maven-dependency-plugin</artifactId>
				<executions>
					<execution>
						<id>export-module-path</id>
						<phase>generate-sources</phase>
						<goals>
							<goal>build-classpath</goal>
						</goals>
						<configuration>
							<outputProperty>module.path</outputProperty>
						</configuration>
					</execution>
				</executions>
			</plugin>
		</plugins>
	</build>

	<reporting>
		<plugins>
			<plugin>
				<groupId>com.github.spotbugs</groupId>
				<artifactId>spotbugs-maven-plugin</artifactId>
				<version>${plugin.spotbugs.version}</version>
			</plugin>
			<plugin>
				<artifactId>maven-javadoc-plugin</artifactId>
				<version>${plugin.javadoc.version}</version>
				<configuration>
					<links>
						<link>${jcip-annotations.javadoc.url}</link>
						<link>${spotbugs.javadoc.url}</link>
						<link>${lombok.javadoc.url}</link>
						<link>${proguard.annotations.javadoc.url}</link>
						<link>${jetbrains-annotations.javadoc.url}</link>
						<link>${slf4j.javadoc.url}</link>
						<link>${junit.platform.javadoc.url}</link>
						<link>${mockito.javadoc.url}</link>
					</links>
				</configuration>
				<reportSets>
					<reportSet>
						<reports>
							<report>javadoc</report>
						</reports>
					</reportSet>
				</reportSets>
			</plugin>
		</plugins>
	</reporting>

	<profiles>
		<profile>
			<id>jdk-8</id>
			<activation>
				<jdk>(,8]</jdk>
			</activation>
			<build>
				<pluginManagement>
					<plugins>
						<plugin>
							<groupId>com.github.wvengen</groupId>
							<artifactId>proguard-maven-plugin</artifactId>
							<configuration>
								<libs>
									<lib>${java.home}/lib/rt.jar</lib>
									<lib>${java.home}/lib/jsse.jar</lib>
								</libs>
							</configuration>
						</plugin>
					</plugins>
				</pluginManagement>
			</build>
		</profile>
		<profile>
			<id>jdk-9</id>
			<activation>
				<jdk>[9,)</jdk>
			</activation>
			<build>
				<pluginManagement>
					<plugins>
						<plugin>
							<artifactId>maven-compiler-plugin</artifactId>
							<configuration>
								<release>${java.version}</release>
								<annotationProcessorPaths>
									<path>
										<groupId>org.projectlombok</groupId>
										<artifactId>lombok</artifactId>
										<version>${lombok.version}</version>
									</path>
								</annotationProcessorPaths>
							</configuration>
						</plugin>
						<plugin>
							<groupId>com.github.wvengen</groupId>
							<artifactId>proguard-maven-plugin</artifactId>
							<configuration>
								<libs>
									<lib>${java.home}/jmods/java.base.jmod</lib>
									<lib>${java.home}/jmods/java.logging.jmod</lib>
									<lib>${java.home}/jmods/java.xml.jmod</lib>
								</libs>
							</configuration>
						</plugin>
					</plugins>
				</pluginManagement>
			</build>
		</profile>
		<profile>
			<id>jdk-16</id>
			<activation>
				<jdk>[16,)</jdk>
			</activation>
			<build>
				<pluginManagement>
					<plugins>
						<plugin>
							<artifactId>maven-compiler-plugin</artifactId>
							<configuration>
								<fork>true</fork>
								<compilerArgs>
									<arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED</arg>
									<arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED</arg>
									<arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED</arg>
									<arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED</arg>
									<arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED</arg>
									<arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED</arg>
									<arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED</arg>
									<arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED</arg>
									<arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED</arg>
									<arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.jvm=ALL-UNNAMED</arg>
								</compilerArgs>
							</configuration>
						</plugin>
					</plugins>
				</pluginManagement>
			</build>
		</profile>
		<profile>
			<id>code-analysis</id>
			<activation>
				<property>
					<name>fullBuild</name>
				</property>
			</activation>
			<build>
				<plugins>
					<plugin>
						<groupId>com.github.spotbugs</groupId>
						<artifactId>spotbugs-maven-plugin</artifactId>
						<executions>
							<execution>
								<id>analyze-compile</id>
								<phase>compile</phase>
								<goals>
									<goal>check</goal>
								</goals>
							</execution>
						</executions>
					</plugin>
				</plugins>
			</build>
		</profile>
		<profile>
			<id>obfuscate</id>
			<activation>
				<file>
					<exists>src/main/java</exists>
					<missing>src/main/webapp</missing>
				</file>
				<property>
					<name>fullBuild</name>
				</property>
			</activation>
			<build>
				<plugins>
					<plugin>
						<groupId>com.github.wvengen</groupId>
						<artifactId>proguard-maven-plugin</artifactId>
						<executions>
							<execution>
								<phase>package</phase>
								<goals>
									<goal>proguard</goal>
								</goals>
							</execution>
						</executions>
					</plugin>
				</plugins>
			</build>
		</profile>
		<profile>
			<id>attach-docs-and-sources</id>
			<activation>
				<property>
					<name>fullBuild</name>
				</property>
			</activation>
			<build>
				<plugins>
					<plugin>
						<artifactId>maven-javadoc-plugin</artifactId>
						<executions>
							<execution>
								<id>attach-javadocs</id>
								<goals>
									<goal>jar</goal>
								</goals>
							</execution>
						</executions>
					</plugin>
				</plugins>
			</build>
		</profile>
		<profile>
			<id>executable</id>
			<activation>
				<property>
					<name>executable</name>
				</property>
			</activation>
			<build>
				<pluginManagement>
					<plugins>
						<plugin>
							<artifactId>maven-jar-plugin</artifactId>
							<configuration>
								<archive>
									<manifest>
										<mainClass>${mainClass.fullPath}</mainClass>
									</manifest>
								</archive>
							</configuration>
						</plugin>
						<plugin>
							<artifactId>maven-shade-plugin</artifactId>
							<version>${plugin.shade.version}</version>
						</plugin>
					</plugins>
				</pluginManagement>
				<plugins>
					<plugin>
						<artifactId>maven-assembly-plugin</artifactId>
						<executions>
							<execution>
								<id>assemble</id>
								<phase>package</phase>
								<goals>
									<goal>single</goal>
								</goals>
								<configuration>
									<archive>
										<manifest>
											<mainClass>${mainClass.fullPath}</mainClass>
										</manifest>
									</archive>
									<descriptorRefs>
										<descriptorRef>jar-with-dependencies</descriptorRef>
									</descriptorRefs>
								</configuration>
							</execution>
						</executions>
					</plugin>
				</plugins>
			</build>
		</profile>
		<profile>
			<id>no-failure-on-javadoc-error</id>
			<build>
				<pluginManagement>
					<plugins>
						<plugin>
							<artifactId>maven-javadoc-plugin</artifactId>
							<configuration>
								<failOnError>false</failOnError>
							</configuration>
						</plugin>
					</plugins>
				</pluginManagement>
			</build>
		</profile>
	</profiles>

	<modules>
		<module>java-parent-test</module>
		<module>webapp-parent</module>
		<module>java-exe-parent</module>
		<module>maven-plugin-parent</module>
	</modules>
	<url>https://docs.urelion.world/me.chrissw-r1/general-parent/3.0.31</url>
	<licenses>
		<license>
			<name>Apache License (ASL), Version 2.0 (Apache-2.0)</name>
			<url>https://raw.githubusercontent.com/spdx/license-list-data/main/text/Apache-2.0.txt</url>
			<distribution>repo</distribution>
		</license>
	</licenses>
	<developers>
		<developer>
			<id>ChrissW-R1</id>
			<name>ChrissW-R1</name>
			<email>contact@ChrissW-R1.me</email>
			<url>https://ChrissW-R1.me</url>
			<timezone>Europe/Berlin</timezone>
		</developer>
	</developers>
</project>
