ta-lib
Used in:
components
- OverviewOverview
- VersionsVersions
- DependentsDependents
- DependenciesDependencies
<dependency>
<groupId>io.github.ta-lib</groupId>
<artifactId>ta-lib</artifactId>
<version>0.8.1</version>
</dependency><?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<!-- Shipped TA-Lib Java library. Hand-written and committed; ta_codegen never
opens this file (the same arrangement as the C# TALib.csproj). What the
generator writes is the source underneath: Core.java's GENCODE section,
FuncUnstId.java, MAType.java and the io.github.talib.metadata registry.
Maven standard layout is deliberate. src/test/java holds the junit-free
main() suites, and living in a separate source root is what keeps them out
of the jar, the sources jar and the javadoc: three exclusion lists that
would otherwise have to be kept in step by hand, each failing silently.
Maven is the ONLY builder of the jar. `ta_codegen build-libraries` with the
java backend runs `./mvnw clean package` (skipping tests) and then tests THAT artifact:
nothing tests a class directory, and there is no second jar to keep in step.
So the compile and the javadoc doclint pass below are the gate's teeth, not
just the release's. Surefire is left with nothing to do (the suites are
junit-free main() classes); the gate compiles them against the built jar and
runs them itself. -->
<modelVersion>4.0.0</modelVersion>
<groupId>io.github.ta-lib</groupId>
<artifactId>ta-lib</artifactId>
<!-- Written by scripts/sync.py from VERSION; do not edit. -->
<version>0.8.1</version>
<packaging>jar</packaging>
<name>TA-Lib</name>
<!-- Published to Central and immutable per version, so it claims a floor, not a
count: scripts/pre-release-checks.py verifies the corpus still meets it. -->
<description>Technical analysis library: 200+ indicators (SMA, EMA, RSI, MACD, Bollinger Bands, ATR, Stochastic, candlestick patterns) - the official Java port of TA-Lib, verified against the C reference.</description>
<url>https://ta-lib.org</url>
<inceptionYear>1999</inceptionYear>
<licenses>
<license>
<name>BSD-3-Clause</name>
<url>https://github.com/TA-Lib/ta-lib/blob/main/LICENSE</url>
<distribution>repo</distribution>
</license>
</licenses>
<developers>
<developer>
<name>Mario Fortier</name>
<email>mario4tier@users.noreply.github.com</email>
<url>https://github.com/mario4tier</url>
<organization>TA-Lib</organization>
<organizationUrl>https://github.com/TA-Lib</organizationUrl>
</developer>
</developers>
<scm>
<connection>scm:git:https://github.com/TA-Lib/ta-lib.git</connection>
<developerConnection>scm:git:ssh://git@github.com/TA-Lib/ta-lib.git</developerConnection>
<url>https://github.com/TA-Lib/ta-lib</url>
<tag>HEAD</tag>
</scm>
<issueManagement>
<system>GitHub Issues</system>
<url>https://github.com/TA-Lib/ta-lib/issues</url>
</issueManagement>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- JDK 17 (LTS). The public API returns `record OutRange` (Java 16+) and the
generated bodies call Math.fma (Java 9+, the cross-language FMA bit-parity
contract of PR #96). Kept in step with JAVA_RELEASE in the generator's
main.rs, which compiles the same sources for the JSON-RPC server. -->
<maven.compiler.release>17</maven.compiler.release>
<!-- Reproducible builds: pins every entry timestamp in the jars so two builds
of the same source produce byte-identical artifacts. Any fixed value works;
this one is the epoch the release line adopted it. -->
<project.build.outputTimestamp>2026-01-01T00:00:00Z</project.build.outputTimestamp>
</properties>
<build>
<!-- BSD-3-Clause clause 2 requires a binary redistribution to reproduce the
copyright notice, the conditions and the disclaimer "in the
documentation and/or other materials provided with the distribution",
and a Central release is immutable — a jar published without it stays
non-compliant forever. The repo-root LICENSE is read in place rather
than copied into src/main/resources: a second copy has nothing keeping
it in step with the first. Four levels up is ta_codegen/output/java/
library -> the repo root, so this module only builds inside the repo,
which is the only place it is ever built.
This replaces the default src/main/resources; there is none.
Coverage: META-INF/LICENSE in the main jar, and maven-source-plugin
picks the same resource up for the sources jar. The javadoc jar is
covered by <bottom> below instead — the javadoc plugin consumes no
resources, and its rendered pages are the "documentation" the clause
names. -->
<resources>
<resource>
<directory>${project.basedir}/../../../..</directory>
<targetPath>META-INF</targetPath>
<includes>
<include>LICENSE</include>
</includes>
</resource>
</resources>
<plugins>
<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-jar-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<archive>
<manifestEntries>
<!-- Without this, JPMS derives the automatic module name from the
artifactId and consumers get `ta.lib`. Naming it matches the
package, and pins it: the derived name is not a stable promise,
this one is. -->
<Automatic-Module-Name>io.github.talib</Automatic-Module-Name>
</manifestEntries>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.4.0</version>
<executions>
<execution>
<id>attach-sources</id>
<goals><goal>jar-no-fork</goal></goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>3.12.0</version>
<configuration>
<!-- The build gate's doclint, not merely the release's: `ta_codegen
build-libraries` builds through this pom, so deleting this line
disarms the gate. `-missing` is off:
the streaming handles and internal cores are deliberately
undocumented. Everything else (a stray `<` in prose lifted from a
function's canonical .md, an unresolvable @see) fails the build
here rather than shipping. -->
<doclint>all,-missing</doclint>
<quiet>true</quiet>
<!-- The javadoc jar's share of BSD-3-Clause clause 2. The plugin
consumes no <resources>, so the notice has to be rendered into
the pages themselves; this replaces the default footer, which
reproduces the copyright line and nothing else. -->
<!-- One line on purpose: Maven collapses the indentation of a wrapped
value away entirely, welding "reserved." onto "Distributed". -->
<bottom><![CDATA[Copyright © 1999-2026, Mario Fortier. All rights reserved. Distributed under the <a href="https://github.com/TA-Lib/ta-lib/blob/main/LICENSE">BSD 3-Clause License</a>: redistributions must retain the copyright notice, this list of conditions and the following disclaimer. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES ARE DISCLAIMED.]]></bottom>
</configuration>
<executions>
<execution>
<id>attach-javadocs</id>
<goals><goal>jar</goal></goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<profiles>
<!-- Signing and publishing live behind a profile so a plain `./mvnw package`
needs neither a GPG key nor Central credentials. Release with:
./mvnw -Prelease deploy
Through the wrapper, never a bare `mvn`: that is what pins which Maven core
produced an artifact Central can never let you correct.
`autoPublish` is false on purpose: the upload is validated and left
pending in the Central Portal, so a bad artifact is dropped rather than
released. Promote it by hand once verified. -->
<profile>
<id>release</id>
<build>
<plugins>
<!-- maven-javadoc-plugin never counts a source edit as a change, so
without this the javadoc jar repackages whatever an earlier build
left behind, doclint never runs, and the build still succeeds. -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-clean-plugin</artifactId>
<version>3.2.0</version>
<executions>
<execution>
<id>release-from-nothing</id>
<phase>initialize</phase>
<goals><goal>clean</goal></goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-gpg-plugin</artifactId>
<version>3.2.8</version>
<configuration>
<!-- Named, because gpg otherwise signs with the first secret key
in the keyring. An absent key fails here; a wrong one fails
at Central, after the upload. Rotating the key is this line
and nothing else: the namespace is bound to the account. -->
<keyname>B351CC3D856EE4AC3DBFD4C44F36E9F467C8547D</keyname>
</configuration>
<executions>
<execution>
<id>sign-artifacts</id>
<phase>verify</phase>
<goals><goal>sign</goal></goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.sonatype.central</groupId>
<artifactId>central-publishing-maven-plugin</artifactId>
<version>0.11.0</version>
<extensions>true</extensions>
<configuration>
<!-- Matches the <server><id> holding the Central Portal user token
in ~/.m2/settings.xml. -->
<publishingServerId>central</publishingServerId>
<autoPublish>false</autoPublish>
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
</project>