bitcoinaddressfinder
Used in:
components
- OverviewOverview
- VersionsVersions
- DependentsDependents
- DependenciesDependencies
<dependency>
<groupId>net.ladenthin</groupId>
<artifactId>bitcoinaddressfinder</artifactId>
<version>1.6.1</version>
</dependency><!--
SPDX-FileCopyrightText: 2017-2026 Bernard Ladenthin <bernard.ladenthin@gmail.com>
SPDX-License-Identifier: Apache-2.0
-->
<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>net.ladenthin</groupId>
<artifactId>bitcoinaddressfinder</artifactId>
<version>1.6.1</version>
<packaging>jar</packaging>
<name>bitcoinaddressfinder</name>
<description>Free high performance tool for fast scanning random Bitcoin, Bitcoin Cash, Bitcoin SV, Litecoin, Dogecoin, Dash, Zcash (and many more) private keys and finding addresses with balance.</description>
<url>https://github.com/bernardladenthin/bitcoinaddressfinder</url>
<licenses>
<license>
<name>The Apache Software License, Version 2.0</name>
<url>https://www.apache.org/licenses/LICENSE-2.0.txt</url>
<distribution>repo</distribution>
</license>
</licenses>
<developers>
<developer>
<name>Bernard Ladenthin</name>
<email>bernard.ladenthin@gmail.com</email>
<organizationUrl>https://github.com/bernardladenthin</organizationUrl>
</developer>
</developers>
<scm>
<connection>scm:git:https://github.com/bernardladenthin/bitcoinaddressfinder.git</connection>
<developerConnection>scm:git:https://github.com/bernardladenthin/bitcoinaddressfinder.git</developerConnection>
<url>https://github.com/bernardladenthin/bitcoinaddressfinder</url>
</scm>
<properties>
<sonar.organization>bernardladenthin</sonar.organization>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<slf4j.version>2.0.18</slf4j.version>
<logback.version>1.5.34</logback.version>
<project.build.outputTimestamp>${git.commit.time}</project.build.outputTimestamp>
<!-- Test JVM heap: -Xmx2g cap, no eager -Xms. With reuseForks=false a fresh JVM is
spawned per test class (~180 sequential spawns); an eager -Xms1g committed 1 GB up
front in every short-lived fork, inflating the spawn-time footprint and occasionally
tripping Surefire's "Error occurred in starting fork" (an OS-level spawn failure, NOT
a timeout) on the memory-heavy pocl OpenCL job. Letting the heap grow lazily keeps the
cap but drops the baseline. The add-opens / add-exports flags that follow must stay
byte-for-byte identical to .mvn/jvm.config (enforced by JvmModuleFlagConsistencyTest). -->
<argLine>-Xmx2g --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.nio=ALL-UNNAMED --add-opens=java.base/jdk.internal.ref=ALL-UNNAMED --add-opens=java.base/jdk.internal.misc=ALL-UNNAMED --add-opens=java.base/sun.nio.ch=ALL-UNNAMED --add-opens=jdk.management/com.sun.management.internal=ALL-UNNAMED --add-opens=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED --add-opens=jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED --add-exports=java.base/java.lang=ALL-UNNAMED --add-exports=java.base/java.io=ALL-UNNAMED --add-exports=java.base/java.nio=ALL-UNNAMED --add-exports=java.base/jdk.internal.ref=ALL-UNNAMED --add-exports=java.base/jdk.internal.misc=ALL-UNNAMED --add-exports=java.base/sun.nio.ch=ALL-UNNAMED --add-exports=jdk.management/com.sun.management.internal=ALL-UNNAMED --add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED --add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED --add-exports=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED --add-exports=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED --add-exports=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED --add-exports=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED --add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED --add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=. -XX:ErrorFile=hs_err_pid%p.log</argLine>
<jcstress.version>0.16</jcstress.version>
<lincheck.version>3.6</lincheck.version>
<vmlens.version>1.2.28</vmlens.version>
<!-- DO NOT UPGRADE jqwik past 1.9.3. jqwik 1.10.0 added a deliberate
anti-AI prompt-injection string to test stdout; the 1.10.1 user
guide states the library "is not meant to be used by any 'AI'
coding agents at all." 1.9.3 is the last pre-disclosure release
and is the pinned version for this repo. Any CI / Dependabot /
contributor PR that bumps this MUST be rejected. See CLAUDE.md
section "jqwik prompt-injection in test output" for full context. -->
<jqwik.version>1.9.3</jqwik.version>
<archunit.version>1.4.2</archunit.version>
<spotbugs.version>4.10.2.0</spotbugs.version>
<fb-contrib.version>7.7.4</fb-contrib.version>
<findsecbugs.version>1.14.0</findsecbugs.version>
<errorprone.version>2.50.0</errorprone.version>
<nullaway.version>0.13.6</nullaway.version>
<checker.version>4.2.0</checker.version>
<java-websocket.version>1.6.0</java-websocket.version>
<jeromq.version>0.6.0</jeromq.version>
<jspecify.version>1.0.0</jspecify.version>
<lombok.version>1.18.46</lombok.version>
<bitcoinj.version>0.17.1</bitcoinj.version>
<bcprov.version>1.84</bcprov.version>
<protobuf.version>4.35.1</protobuf.version>
<jsr305.version>3.0.2</jsr305.version>
<jcip-annotations.version>1.0</jcip-annotations.version>
<guava.version>33.6.0-jre</guava.version>
<jackson.version>2.22.0</jackson.version>
<lmdbjava.version>0.9.3</lmdbjava.version>
<jocl.version>2.0.6</jocl.version>
<commons-io.version>2.22.0</commons-io.version>
<commons-codec.version>1.22.0</commons-codec.version>
<maven-artifact.version>3.9.16</maven-artifact.version>
<junit.version>6.1.0</junit.version>
<hamcrest.version>3.0</hamcrest.version>
<mockito.version>5.23.0</mockito.version>
<logcaptor.version>2.12.6</logcaptor.version>
<jmh.version>1.37</jmh.version>
<spotless.version>3.7.0</spotless.version>
<palantir-java-format.version>2.92.0</palantir-java-format.version>
</properties>
<!--
Pin transitively-conflicting versions so maven-enforcer's
dependencyConvergence rule passes. Each entry below resolves a real
version mismatch surfaced by the rule (the direct dep version we
declare in <dependencies> must always win over the older one a
transitive dep brings in).
-->
<dependencyManagement>
<dependencies>
<!-- slf4j-api: bitcoinj brings 2.0.16, Java-WebSocket brings 2.0.13,
logback-classic brings 2.0.17; we declare 2.0.18 directly. -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<!-- guava: bitcoinj brings 33.4.0-android; we declare ${guava.version} directly. -->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>${guava.version}</version>
</dependency>
<!-- protobuf-javalite: bitcoinj brings 4.33.4; we declare ${protobuf.version} directly. -->
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-javalite</artifactId>
<version>${protobuf.version}</version>
</dependency>
<!-- bouncycastle: bitcoinj brings 1.83; we declare ${bcprov.version} directly. -->
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15to18</artifactId>
<version>${bcprov.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<distributionManagement>
<snapshotRepository>
<id>central</id>
<url>https://central.sonatype.com/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
<build>
<resources>
<resource>
<directory>${basedir}/src/main/resources</directory>
</resource>
</resources>
<pluginManagement>
<plugins>
<plugin>
<groupId>com.diffplug.spotless</groupId>
<artifactId>spotless-maven-plugin</artifactId>
<version>${spotless.version}</version>
</plugin>
<plugin>
<groupId>com.github.spotbugs</groupId>
<artifactId>spotbugs-maven-plugin</artifactId>
<version>${spotbugs.version}</version>
</plugin>
<plugin>
<groupId>com.vmlens</groupId>
<artifactId>vmlens-maven-plugin</artifactId>
<version>${vmlens.version}</version>
</plugin>
<plugin>
<groupId>io.github.git-commit-id</groupId>
<artifactId>git-commit-id-maven-plugin</artifactId>
<version>10.0.0</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.15.0</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<version>3.6.3</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-gpg-plugin</artifactId>
<version>3.2.8</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.5.0</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>3.12.0</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.4.0</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.5.6</version>
<configuration>
<!--
Tests in the `vmlens` package are meaningful only under the vmlens
agent (the `vmlens` profile / CI job). Without the agent an
AllInterleavings loop body never executes (a vacuous pass that also
prints an "agent not configured" warning), so exclude the whole
package from the ordinary surefire run. The vmlens job re-includes
them with `-Dtest=...`, which overrides this exclude. Merged with
the main surefire <argLine>/fork config below via pluginManagement.
-->
<excludes>
<exclude>**/vmlens/*.java</exclude>
</excludes>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>3.6.3</version>
</plugin>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.15</version>
</plugin>
<plugin>
<groupId>org.pitest</groupId>
<artifactId>pitest-maven</artifactId>
<version>1.25.4</version>
</plugin>
<plugin>
<groupId>org.sonatype.central</groupId>
<artifactId>central-publishing-maven-plugin</artifactId>
<version>0.11.0</version>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<groupId>io.github.git-commit-id</groupId>
<artifactId>git-commit-id-maven-plugin</artifactId>
<executions>
<execution>
<id>get-git-properties</id>
<goals>
<goal>revision</goal>
</goals>
<phase>initialize</phase>
</execution>
</executions>
<configuration>
<dateFormat>yyyy-MM-dd'T'HH:mm:ss'Z'</dateFormat>
<dateFormatTimeZone>UTC</dateFormatTimeZone>
<generateGitPropertiesFile>false</generateGitPropertiesFile>
<failOnNoGitDirectory>false</failOnNoGitDirectory>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<executions>
<execution>
<id>enforce-maven</id>
<goals>
<goal>enforce</goal>
</goals>
<configuration>
<rules>
<requireMavenVersion>
<version>[3.6.3,)</version>
</requireMavenVersion>
<requireJavaVersion>
<version>[21,)</version>
</requireJavaVersion>
<dependencyConvergence/>
<bannedDependencies>
<excludes>
<!-- Use SLF4J directly; never commons-logging. -->
<exclude>commons-logging:commons-logging</exclude>
<!-- Legacy / EoL logging frameworks. -->
<exclude>log4j:log4j</exclude>
<!-- Old hamcrest split artifacts; use hamcrest:hamcrest 2.x+. -->
<exclude>org.hamcrest:hamcrest-core</exclude>
<exclude>org.hamcrest:hamcrest-library</exclude>
<exclude>org.hamcrest:hamcrest-all</exclude>
<!-- Legacy JUnit 3 / 4; we use Jupiter (junit:junit-jupiter). -->
<exclude>junit:junit</exclude>
<exclude>junit:junit-dep</exclude>
</excludes>
</bannedDependencies>
</rules>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<executions>
<execution>
<id>prepare-agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>report</id>
<phase>test</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<!-- Declared BEFORE maven-compiler-plugin on purpose. The attach-javadocs
execution below and the compiler's module-info-compile execution are both
bound to prepare-package, and Maven runs same-phase executions in plugin
declaration order. Javadoc must run first — while target/classes/ still has
no module-info.class — so it stays in classpath mode. Module mode is
unusable here: the module declares no `requires`, so in module mode javadoc
cannot see classpath dependencies (bitcoinj, jspecify, slf4j) and also
mis-stages module-source-path because module-info.java lives off the source
path in src/main/java9. See the module-info-compile execution for details. -->
<configuration>
<source>21</source>
<failOnError>true</failOnError>
<failOnWarnings>true</failOnWarnings>
<doclint>all</doclint>
<additionalJOptions>
<additionalJOption>--add-opens=java.base/java.lang=ALL-UNNAMED</additionalJOption>
<additionalJOption>--add-opens=java.base/java.io=ALL-UNNAMED</additionalJOption>
<additionalJOption>--add-opens=java.base/java.nio=ALL-UNNAMED</additionalJOption>
<additionalJOption>--add-opens=java.base/jdk.internal.ref=ALL-UNNAMED</additionalJOption>
<additionalJOption>--add-opens=java.base/jdk.internal.misc=ALL-UNNAMED</additionalJOption>
<additionalJOption>--add-opens=java.base/sun.nio.ch=ALL-UNNAMED</additionalJOption>
<additionalJOption>--add-opens=jdk.management/com.sun.management.internal=ALL-UNNAMED</additionalJOption>
<additionalJOption>--add-opens=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED</additionalJOption>
<additionalJOption>--add-opens=jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED</additionalJOption>
<additionalJOption>--add-exports=java.base/java.lang=ALL-UNNAMED</additionalJOption>
<additionalJOption>--add-exports=java.base/java.io=ALL-UNNAMED</additionalJOption>
<additionalJOption>--add-exports=java.base/java.nio=ALL-UNNAMED</additionalJOption>
<additionalJOption>--add-exports=java.base/jdk.internal.ref=ALL-UNNAMED</additionalJOption>
<additionalJOption>--add-exports=java.base/jdk.internal.misc=ALL-UNNAMED</additionalJOption>
<additionalJOption>--add-exports=java.base/sun.nio.ch=ALL-UNNAMED</additionalJOption>
<additionalJOption>--add-exports=jdk.management/com.sun.management.internal=ALL-UNNAMED</additionalJOption>
<additionalJOption>--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED</additionalJOption>
<additionalJOption>--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED</additionalJOption>
<additionalJOption>--add-exports=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED</additionalJOption>
<additionalJOption>--add-exports=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED</additionalJOption>
<additionalJOption>--add-exports=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED</additionalJOption>
<additionalJOption>--add-exports=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED</additionalJOption>
<additionalJOption>--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED</additionalJOption>
<additionalJOption>--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED</additionalJOption>
</additionalJOptions>
</configuration>
<executions>
<execution>
<id>attach-javadocs</id>
<!-- Run at prepare-package (after test, before the package phase that
compiles module-info.class) instead of the default package phase.
At prepare-package, target/classes/ holds no module-info.class, so
maven-javadoc-plugin sees a non-modular project and runs javadoc in
classpath mode. If it ran in the package phase it would detect the
freshly compiled descriptor and switch into JPMS module mode, which
— because module-info.java lives in src/main/java9 (off javadoc's
source path) — stages an inconsistent module-source-path and
fails with "No source files for package net.ladenthin...". See the
module-info-compile execution above for the full rationale.
prepare-package is after test in the lifecycle, so `mvn test` (which
does not pass -Dmaven.javadoc.skip) still never triggers javadoc. -->
<phase>prepare-package</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<release>21</release>
<parameters>true</parameters>
<compilerArgs>
<!--
-Xlint:all surfaces every category of javac warning at compile time.
-Werror promotes every warning to a compile-time error. Pre-flip
history: the original 6-item warning list (deprecated Thread.getId,
deprecated jocl CL_DEVICE_QUEUE_PROPERTIES, two 'this' escapes in
KeyProducerJavaSocket/Zmq, Closeable.close declaring
InterruptedException, explicit close on auto-closeable in
OpenClTask) was cleared in commit 6eadc6f; 14 Checker Framework
[type.anno.before.modifier] warnings were cleared in commit f37f162;
the last 5 sun.misc.Unsafe proprietary-API warnings were eliminated
by deleting ByteBufferUtility#freeByteBuffer entirely — direct
ByteBuffers are now reclaimed by the JVM's built-in Cleaner when
they become unreachable, which already was the fallback for
OpenJ9 / GraalVM Native Image / Android.
-Xlint exclusion list:
-serial : Serializable without serialVersionUID is not the
concern of this hot-path / value-object codebase.
-options : Suppresses release/target informational notes.
-classfile: Suppresses classfile-format notes from third-party deps.
-processing: Suppresses "No processor claimed any of these
annotations" AP-emitted notes.
-->
<arg>-Xlint:all,-serial,-options,-classfile,-processing</arg>
<arg>-Werror</arg>
<!--
Checker Framework Nullness Checker runs as a second nullness pass
alongside NullAway. CF is generics-aware and stricter than NullAway,
so it acts as a second-opinion verifier on the same JSpecify
annotations.
-->
<!-- Lombok's two AP classes must be listed alongside the Checker Framework
processor so javac runs all three. Without naming the Lombok processors
here they are silently skipped because the explicit -processor arg
overrides SPI-registered processors. -->
<arg>-processor</arg>
<arg>lombok.launch.AnnotationProcessorHider$AnnotationProcessor,lombok.launch.AnnotationProcessorHider$ClaimingProcessor,org.checkerframework.checker.nullness.NullnessChecker</arg>
<!--
Override CF 4.1.0's incorrect Objects.requireNonNull stub. The shipped
stub annotates obj as @NonNull, the opposite of the JDK contract.
-->
<arg>-Astubs=src/etc/checker/objects.astub</arg>
<arg>-XDaddTypeAnnotationsToSymbol=true</arg>
<arg>-XDcompilePolicy=simple</arg>
<arg>--should-stop=ifError=FLOW</arg>
<arg>-Xplugin:ErrorProne -Xep:NullAway:ERROR -XepOpt:NullAway:OnlyNullMarked=true -XepOpt:NullAway:JSpecifyMode=true -XepOpt:NullAway:CheckOptionalEmptiness=true -XepOpt:NullAway:AcknowledgeRestrictiveAnnotations=true -XepOpt:NullAway:AcknowledgeAndroidRecent=true -XepOpt:NullAway:AssertsEnabled=true -Xep:BoxedPrimitiveEquality:ERROR -Xep:EqualsHashCode:ERROR -Xep:EqualsIncompatibleType:ERROR -Xep:IdentityBinaryExpression:ERROR -Xep:SelfAssignment:ERROR -Xep:SelfComparison:ERROR -Xep:SelfEquals:ERROR -Xep:DeadException:ERROR -Xep:FormatString:ERROR -Xep:InvalidPatternSyntax:ERROR -Xep:OptionalEquality:ERROR -Xep:ImpossibleNullComparison:ERROR</arg>
<!-- For ErrorProne, DO NOT TOUCH, documented here: https://errorprone.info/docs/installation#jdk-16 -->
<arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED</arg>
<arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED</arg>
<arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED</arg>
<arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED</arg>
<arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED</arg>
<arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED</arg>
<arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED</arg>
<arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED</arg>
<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>
<!-- Runtime system-module access lives in argLine / .mvn/jvm.config /
examples/*.bat. It is intentionally NOT duplicated into compilerArgs:
system-module add-exports/add-opens are forbidden under release
(JEP 247/261) and the main compile no longer needs them. Production
code imports no internal-JDK package — the only former user,
ByteBufferUtility#freeByteBuffer, was deleted (direct buffers are now
reclaimed by the JVM's built-in Cleaner). The runtime flags survive in
<argLine> for lmdbjava, whose off-heap ByteBufferProxy reflectively
reaches sun.nio.ch.DirectBuffer / jdk.internal.ref.Cleaner. -->
</compilerArgs>
<annotationProcessorPaths>
<!-- Lombok must run FIRST so the equals/hashCode/toString
methods it generates exist when Error Prone, NullAway,
and Checker Framework analyze the compilation unit.
Without this, Lombok annotations are silently ignored
and the methods fall back to java.lang.Object defaults. -->
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</path>
<path>
<groupId>com.google.errorprone</groupId>
<artifactId>error_prone_core</artifactId>
<version>${errorprone.version}</version>
</path>
<path>
<groupId>com.uber.nullaway</groupId>
<artifactId>nullaway</artifactId>
<version>${nullaway.version}</version>
</path>
<path>
<groupId>org.checkerframework</groupId>
<artifactId>checker</artifactId>
<version>${checker.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
<executions>
<execution>
<id>module-info-compile</id>
<!-- Bind to prepare-package (after test-compile/test, before package) so
module-info.class is not present in target/classes/ while the test
sources compile or run. If it were, Surefire would see a module
descriptor and run the tests in JPMS module mode (main code as the
named module net.ladenthin.bitcoinaddressfinder on the module path)
instead of on the classpath as the unnamed module. The test JVM's
`add-opens java.base/{sun.nio.ch,jdk.internal.ref,java.nio}=ALL-UNNAMED`
flags (see argLine) open those internal packages to the UNNAMED
module only — lmdbjava's off-heap ByteBufferProxy reflectively reaches
sun.nio.ch.DirectBuffer / jdk.internal.ref.Cleaner — so in module mode
they no longer apply and LMDB tests fail with IllegalAccessError on
sun.nio.ch.DirectBuffer. (This is NOT about project code: the only
former internal-JDK user, ByteBufferUtility#freeByteBuffer, was
deleted — direct buffers are reclaimed by the JVM's built-in Cleaner.)
By the time
maven-jar-plugin runs in the package phase the descriptor is in
place and ends up at the jar root as expected (binding it to
package itself is NOT reliable: the jar packaging's default-jar
execution runs before an explicitly-declared package-phase
execution, so the descriptor would miss the jar).
Ordering vs. javadoc: the maven-javadoc-plugin attach-javadocs
execution is ALSO bound to prepare-package and MUST run before this
execution, so that javadoc sees a module-info-free target/classes
and stays in classpath mode (see that execution's comment for why
module mode breaks here). Same-phase ordering follows plugin
declaration order in <build><plugins>, so the maven-javadoc-plugin
block is declared before this maven-compiler-plugin block.
Local-dev caveat: running `mvn test` AFTER `mvn package` without
an intervening `mvn clean` will fail with IllegalAccessError on
sun.nio.ch.DirectBuffer because the package phase leaves
module-info.class in target/classes/. CI is unaffected because
the Build and Test jobs run in separate runners with fresh
checkouts. Run `mvn clean test` to reset. -->
<phase>prepare-package</phase>
<goals>
<goal>compile</goal>
</goals>
<configuration>
<!-- module-info.java lives in src/main/java9 so the default-compile
pass cannot see it (BAF compiles at source/target 21 which
supports modules; if javac sees module-info anywhere on its
source path it auto-activates module mode and rejects every
ordinary import as "package is not visible in unnamed module").
This dedicated execution compiles the descriptor alone at
release 9 without the Error Prone / NullAway / Checker
Framework processors. BAF runs as a fat-jar (assembly profile)
on the classpath and tests run on the classpath as well, so
the module descriptor is informational — it gives module-path
consumers a deterministic module name and the documented
Jackson opens directive, but never gates any build or runtime
resolution. -->
<release>9</release>
<compileSourceRoots>
<compileSourceRoot>${project.basedir}/src/main/java9</compileSourceRoot>
</compileSourceRoots>
<compilerArgs combine.self="override"/>
<annotationProcessorPaths combine.self="override"/>
</configuration>
</execution>
<execution>
<id>default-testCompile</id>
<configuration>
<!--
JMH annotation processor generates harness classes in net.ladenthin.*,
which NullAway would then analyze and fail (generated code lacks @NonNull
annotations). Turn NullAway OFF for test compilation; hand-written test
code is still checked via the default-compile phase on the main sources.
Also drop -parameters here so JMH / jcstress reflection doesn't pick up
parameter names from MethodParameters.
Override the parent release=21 back to source/target=21: this test
compile passes the shared "master" system-module add-exports /
add-opens list below (java.base/* and jdk.compiler/* — the latter
required for Error Prone to reach com.sun.tools.javac internals on
JDK 16+), and release mode rejects add-exports/add-opens to system
modules (JEP 247/261). The main default-compile keeps release 21
because it does NOT pass those bare flags (its Error Prone access uses
`-J`-prefixed JVM args, which are unaffected by release mode). Note: no
project source actually imports jdk.internal.ref / sun.nio.ch — those
packages are only opened at RUNTIME for lmdbjava (see argLine).
-->
<release combine.self="override"></release>
<source>21</source>
<target>21</target>
<parameters>false</parameters>
<compilerArgs combine.self="override">
<arg>-XDaddTypeAnnotationsToSymbol=true</arg>
<arg>-XDcompilePolicy=simple</arg>
<arg>--should-stop=ifError=FLOW</arg>
<arg>-Xplugin:ErrorProne -Xep:NullAway:OFF -Xep:GuardedBy:OFF</arg>
<!-- For ErrorProne, DO NOT TOUCH, documented here: https://errorprone.info/docs/installation#jdk-16 -->
<arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED</arg>
<arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED</arg>
<arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED</arg>
<arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED</arg>
<arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED</arg>
<arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED</arg>
<arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED</arg>
<arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED</arg>
<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>
<!-- Master JVM-flag list: keep identical (same set + same order) across pom.xml (this list + <argLine> + the javadoc additionalJOptions), .mvn/jvm.config, examples/*.bat, examples/*.sh, and the JMH @Fork jvmArgsAppend in src/test/.../benchmark/*.java. Enforced by JvmModuleFlagConsistencyTest (fails the build on any drift). -->
<arg>--add-opens</arg><arg>java.base/java.lang=ALL-UNNAMED</arg>
<arg>--add-opens</arg><arg>java.base/java.io=ALL-UNNAMED</arg>
<arg>--add-opens</arg><arg>java.base/java.nio=ALL-UNNAMED</arg>
<arg>--add-opens</arg><arg>java.base/jdk.internal.ref=ALL-UNNAMED</arg>
<arg>--add-opens</arg><arg>java.base/jdk.internal.misc=ALL-UNNAMED</arg>
<arg>--add-opens</arg><arg>java.base/sun.nio.ch=ALL-UNNAMED</arg>
<arg>--add-opens</arg><arg>jdk.management/com.sun.management.internal=ALL-UNNAMED</arg>
<arg>--add-opens</arg><arg>jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED</arg>
<arg>--add-opens</arg><arg>jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED</arg>
<arg>--add-exports</arg><arg>java.base/java.lang=ALL-UNNAMED</arg>
<arg>--add-exports</arg><arg>java.base/java.io=ALL-UNNAMED</arg>
<arg>--add-exports</arg><arg>java.base/java.nio=ALL-UNNAMED</arg>
<arg>--add-exports</arg><arg>java.base/jdk.internal.ref=ALL-UNNAMED</arg>
<arg>--add-exports</arg><arg>java.base/jdk.internal.misc=ALL-UNNAMED</arg>
<arg>--add-exports</arg><arg>java.base/sun.nio.ch=ALL-UNNAMED</arg>
<arg>--add-exports</arg><arg>jdk.management/com.sun.management.internal=ALL-UNNAMED</arg>
<arg>--add-exports</arg><arg>jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED</arg>
<arg>--add-exports</arg><arg>jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED</arg>
<arg>--add-exports</arg><arg>jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED</arg>
<arg>--add-exports</arg><arg>jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED</arg>
<arg>--add-exports</arg><arg>jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED</arg>
<arg>--add-exports</arg><arg>jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED</arg>
<arg>--add-exports</arg><arg>jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED</arg>
<arg>--add-exports</arg><arg>jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED</arg>
</compilerArgs>
<annotationProcessorPaths combine.children="append">
<path>
<groupId>org.openjdk.jcstress</groupId>
<artifactId>jcstress-core</artifactId>
<version>${jcstress.version}</version>
</path>
<path>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-generator-annprocess</artifactId>
<version>${jmh.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<!-- Default Surefire plugin config (forking enabled) -->
<configuration>
<!-- Fork just one JVM for test isolation -->
<forkCount>1</forkCount>
<reuseForks>false</reuseForks>
<!-- Properly include JaCoCo agent and any other injected argLine -->
<argLine>@{argLine}</argLine>
<!-- Whole-fork budget: with reuseForks=false this must cover JVM
startup + EVERY method of one test class + JVM shutdown.
60s was sporadically exceeded by socket-heavy classes
(e.g. KeyProducerJavaZmqTest) on loaded Windows runners,
killing the fork with "There was a timeout in the fork"
even though all tests passed. -->
<forkedProcessTimeoutInSeconds>180</forkedProcessTimeoutInSeconds>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>net.ladenthin.bitcoinaddressfinder.cli.Main</mainClass>
<packageName>net.ladenthin.bitcoinaddressfinder</packageName>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>net.ladenthin.bitcoinaddressfinder.cli.Main</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<executions>
<execution>
<id>attach-sources</id>
<phase>verify</phase>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>com.diffplug.spotless</groupId>
<artifactId>spotless-maven-plugin</artifactId>
<configuration>
<java>
<includes>
<include>src/main/java/**/*.java</include>
<include>src/test/java/**/*.java</include>
</includes>
<palantirJavaFormat>
<version>${palantir-java-format.version}</version>
</palantirJavaFormat>
<removeUnusedImports/>
<trimTrailingWhitespace/>
<endWithNewline/>
</java>
</configuration>
<executions>
<execution>
<id>spotless-check</id>
<phase>verify</phase>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>com.github.spotbugs</groupId>
<artifactId>spotbugs-maven-plugin</artifactId>
<configuration>
<effort>Max</effort>
<threshold>Low</threshold>
<failOnError>true</failOnError>
<includeTests>false</includeTests>
<excludeFilterFile>spotbugs-exclude.xml</excludeFilterFile>
<plugins>
<plugin>
<groupId>com.mebigfatguy.fb-contrib</groupId>
<artifactId>fb-contrib</artifactId>
<version>${fb-contrib.version}</version>
</plugin>
<plugin>
<groupId>com.h3xstream.findsecbugs</groupId>
<artifactId>findsecbugs-plugin</artifactId>
<version>${findsecbugs.version}</version>
</plugin>
</plugins>
</configuration>
<executions>
<execution>
<id>spotbugs-check</id>
<phase>verify</phase>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<configuration>
<mainClass>org.openjdk.jmh.Main</mainClass>
<classpathScope>test</classpathScope>
</configuration>
</plugin>
<plugin>
<!--
PIT mutation testing is gated at a 100% threshold on every CI
build over the explicit list of classes that have reached 100%
mutation parity (verified with pitest-maven 1.25.4). Expand the
targetClasses list as more classes reach parity (see README
TODO). The targeted classes are covered by fast, pure-Java unit
tests (no LMDB / OpenCL / GPU needed), kept in lock-step in the
targetTests list.
CI invocation pattern (matches streambuffer):
mvn test-compile org.pitest:pitest-maven:mutationCoverage
PIT runs right after test-compile so the prepare-package-bound
module-info-compile execution does not fire; module-info.class
stays out of target/classes/ and the forked PIT JVMs continue
to run in classpath mode (consistent with the rest of the test
suite).
-->
<groupId>org.pitest</groupId>
<artifactId>pitest-maven</artifactId>
<dependencies>
<dependency>
<groupId>org.pitest</groupId>
<artifactId>pitest-junit5-plugin</artifactId>
<version>1.2.3</version>
</dependency>
</dependencies>
<configuration>
<targetClasses>
<!-- Classes verified at 100% PIT mutation parity. Expand as more reach it. -->
<param>net.ladenthin.bitcoinaddressfinder.util.BitHelper</param>
<param>net.ladenthin.bitcoinaddressfinder.util.PrivateKeyTooLargeException</param>
<param>net.ladenthin.bitcoinaddressfinder.model.PublicKeyBytes</param>
<param>net.ladenthin.bitcoinaddressfinder.model.AddressToCoin</param>
<param>net.ladenthin.bitcoinaddressfinder.model.AddressType</param>
<param>net.ladenthin.bitcoinaddressfinder.model.Hash160</param>
<param>net.ladenthin.bitcoinaddressfinder.io.AddressFormatNotAcceptedException</param>
<param>net.ladenthin.bitcoinaddressfinder.core.InterruptedRuntimeException</param>
<param>net.ladenthin.bitcoinaddressfinder.keyproducer.KeyProducerIdIsNotUniqueException</param>
<param>net.ladenthin.bitcoinaddressfinder.keyproducer.KeyProducerIdNullException</param>
<param>net.ladenthin.bitcoinaddressfinder.keyproducer.KeyProducerIdUnknownException</param>
<param>net.ladenthin.bitcoinaddressfinder.secret.NoMoreSecretsAvailableException</param>
<param>net.ladenthin.bitcoinaddressfinder.configuration.UnknownSecretFormatException</param>
<param>net.ladenthin.bitcoinaddressfinder.configuration.CKeyProducerJavaIncremental</param>
<param>net.ladenthin.bitcoinaddressfinder.statistics.Statistics</param>
<param>net.ladenthin.bitcoinaddressfinder.statistics.ReadStatistic</param>
</targetClasses>
<targetTests>
<param>net.ladenthin.bitcoinaddressfinder.util.BitHelperTest</param>
<param>net.ladenthin.bitcoinaddressfinder.util.PrivateKeyTooLargeExceptionTest</param>
<param>net.ladenthin.bitcoinaddressfinder.model.PublicKeyBytesTest</param>
<param>net.ladenthin.bitcoinaddressfinder.model.AddressToCoinTest</param>
<param>net.ladenthin.bitcoinaddressfinder.model.AddressTypeTest</param>
<param>net.ladenthin.bitcoinaddressfinder.model.Hash160Test</param>
<param>net.ladenthin.bitcoinaddressfinder.io.AddressFormatNotAcceptedExceptionTest</param>
<param>net.ladenthin.bitcoinaddressfinder.core.InterruptedRuntimeExceptionTest</param>
<param>net.ladenthin.bitcoinaddressfinder.keyproducer.KeyProducerIdIsNotUniqueExceptionTest</param>
<param>net.ladenthin.bitcoinaddressfinder.keyproducer.KeyProducerIdNullExceptionTest</param>
<param>net.ladenthin.bitcoinaddressfinder.keyproducer.KeyProducerIdUnknownExceptionTest</param>
<param>net.ladenthin.bitcoinaddressfinder.secret.NoMoreSecretsAvailableExceptionTest</param>
<param>net.ladenthin.bitcoinaddressfinder.configuration.UnknownSecretFormatExceptionTest</param>
<param>net.ladenthin.bitcoinaddressfinder.configuration.CKeyProducerJavaIncrementalTest</param>
<param>net.ladenthin.bitcoinaddressfinder.statistics.StatisticsTest</param>
<param>net.ladenthin.bitcoinaddressfinder.statistics.ReadStatisticTest</param>
</targetTests>
<mutationThreshold>100</mutationThreshold>
<timeoutConstant>30000</timeoutConstant>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.java-websocket</groupId>
<artifactId>Java-WebSocket</artifactId>
<version>${java-websocket.version}</version>
</dependency>
<dependency>
<groupId>org.zeromq</groupId>
<artifactId>jeromq</artifactId>
<version>${jeromq.version}</version>
</dependency>
<dependency>
<groupId>org.jspecify</groupId>
<artifactId>jspecify</artifactId>
<version>${jspecify.version}</version>
</dependency>
<dependency>
<groupId>org.checkerframework</groupId>
<artifactId>checker-qual</artifactId>
<version>${checker.version}</version>
</dependency>
<dependency>
<groupId>org.bitcoinj</groupId>
<artifactId>bitcoinj-core</artifactId>
<version>${bitcoinj.version}</version>
</dependency>
<!-- Required by bitcoinj-core (transitive). Pinned here to keep on the latest secure version. -->
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15to18</artifactId>
<version>${bcprov.version}</version>
</dependency>
<!-- Required by bitcoinj-core (transitive). Pinned here to keep on the latest secure version. -->
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-javalite</artifactId>
<version>${protobuf.version}</version>
</dependency>
<!-- Required by bitcoinj-core (transitive, runtime). Pinned here to keep on the latest version. -->
<dependency>
<groupId>com.google.code.findbugs</groupId>
<artifactId>jsr305</artifactId>
<version>${jsr305.version}</version>
<scope>runtime</scope>
</dependency>
<!-- Required by bitcoinj-core (transitive, runtime). Pinned here to keep on the latest version. -->
<dependency>
<groupId>net.jcip</groupId>
<artifactId>jcip-annotations</artifactId>
<version>${jcip-annotations.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>${guava.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-yaml</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${logback.version}</version>
</dependency>
<dependency>
<groupId>org.lmdbjava</groupId>
<artifactId>lmdbjava</artifactId>
<version>${lmdbjava.version}</version>
</dependency>
<dependency>
<groupId>org.jocl</groupId>
<artifactId>jocl</artifactId>
<version>${jocl.version}</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>${commons-io.version}</version>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>${commons-codec.version}</version>
</dependency>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-artifact</artifactId>
<version>${maven-artifact.version}</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest</artifactId>
<version>${hamcrest.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>${mockito.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.github.hakky54</groupId>
<artifactId>logcaptor</artifactId>
<version>${logcaptor.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>net.jqwik</groupId>
<artifactId>jqwik</artifactId>
<version>${jqwik.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.tngtech.archunit</groupId>
<artifactId>archunit-junit5</artifactId>
<version>${archunit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-core</artifactId>
<version>${jmh.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-generator-annprocess</artifactId>
<version>${jmh.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.openjdk.jcstress</groupId>
<artifactId>jcstress-core</artifactId>
<version>${jcstress.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jetbrains.lincheck</groupId>
<artifactId>lincheck</artifactId>
<version>${lincheck.version}</version>
<scope>test</scope>
</dependency>
<!--
vmlens interleaving-analysis API. Test-scoped and transitive-dependency-free
(its own deps are all test-scope, hence not propagated), so it is safe on the
default test classpath under dependencyConvergence. Needed so the
VmlensInterleavingSmoke* test compiles in every build; it is only *executed*
under the `vmlens` profile (see that profile + the vmlens CI job). The default
surefire run excludes it (managed surefire <excludes> below) so the vmlens
agent's JDK 9 API class is never loaded outside the agent-driven run.
-->
<dependency>
<groupId>com.vmlens</groupId>
<artifactId>api</artifactId>
<version>${vmlens.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
<profiles>
<profile>
<id>release</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-gpg-plugin</artifactId>
<executions>
<execution>
<id>sign-artifacts</id>
<phase>verify</phase>
<goals><goal>sign</goal></goals>
<configuration>
<keyname>${gpg.keyname}</keyname>
<gpgArguments>
<arg>--pinentry-mode</arg>
<arg>loopback</arg>
</gpgArguments>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.sonatype.central</groupId>
<artifactId>central-publishing-maven-plugin</artifactId>
<extensions>true</extensions>
<configuration>
<publishingServerId>central</publishingServerId>
<autoPublish>true</autoPublish>
<waitUntil>published</waitUntil>
</configuration>
</plugin>
</plugins>
</build>
</profile>
<profile>
<id>vmlens</id>
<build>
<plugins>
<plugin>
<groupId>com.vmlens</groupId>
<artifactId>vmlens-maven-plugin</artifactId>
<configuration>
<!--
Run vmlens interleaving analysis over the whole `vmlens` test
package: the smoke test plus the real interleaving tests (e.g.
KeyProducerQueueBufferedInterleavingTest). The `com.vmlens:api`
test dependency lives in the main <dependencies> block. Add new
interleaving tests to the `vmlens` package and they are picked
up automatically.
-->
<includes>
<include>**/vmlens/*.java</include>
</includes>
</configuration>
<executions>
<execution>
<id>vmlens-test</id>
<goals>
<goal>test</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
<profile>
<id>jcstress</id>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<executions>
<execution>
<id>jcstress</id>
<phase>test</phase>
<goals><goal>exec</goal></goals>
<configuration>
<executable>${java.home}/bin/java</executable>
<classpathScope>test</classpathScope>
<arguments>
<argument>-classpath</argument>
<classpath/>
<argument>org.openjdk.jcstress.Main</argument>
<argument>-v</argument>
<argument>-m</argument>
<argument>default</argument>
</arguments>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
<profile>
<!--
Builds the fat (jar-with-dependencies) jar for shipping the CLI.
Off by default because the assembly step is expensive and only
needed when packaging a runnable artifact, not during inner-loop
builds. Documented in CLAUDE.md "Build Commands" as
`./mvnw package -P assembly`.
-->
<id>assembly</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<id>build-fat-jar</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
</project>