blob: 56c66e6e84988e7ad3177bfb99975759801b3fd7 [file]
<?xml version="1.0" encoding="UTF-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
<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">
<parent>
<artifactId>be-java-extensions</artifactId>
<groupId>org.apache.doris</groupId>
<version>${revision}</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>plugin-toolkit</artifactId>
<name>Doris BE Plugin Toolkit</name>
<description>
Utilities shared by the plugins' source, never by their runtime.
Unlike jni-spi this jar is NOT on BE's classpath: each plugin that wants it declares a
normal compile dependency and gets its own copy inside its own directory. So two plugins
using it share the source but not the classes, which is the whole point - a bug fix reaches
both, while neither can be affected by the other's version of anything. Trino's
trino-plugin-toolkit works the same way.
The corollary is that anything added here is duplicated into every consumer, so it must be
code that genuinely has more than one, and it must stay dependency-free: a dependency here
would be forced on every plugin that wants any part of the toolkit.
</description>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<!--
Narrowed to test scope for the same reason as in jni-spi: the fe parent pom declares
these for every module, and a child cannot drop an inherited dependency. See that pom
for the full explanation. Do not "fix" these to compile scope.
-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j2-impl</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-1.2-api</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>doris-plugin-toolkit</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<executions>
<execution>
<id>enforce-plugin-toolkit-stays-dependency-free</id>
<phase>validate</phase>
<goals>
<goal>enforce</goal>
</goals>
<configuration>
<rules>
<bannedDependencies>
<searchTransitive>true</searchTransitive>
<excludes>
<exclude>*</exclude>
</excludes>
<includes>
<!--
jni-spi is pre-authorised, but only in provided scope: a
compile-scope SPI would be copied into every consuming
plugin's directory, and the loader rejects a plugin that
ships its own SPI copy.
-->
<include>org.apache.doris:jni-spi:*:*:provided</include>
<include>*:*:*:*:test</include>
</includes>
<message>
plugin-toolkit must stay dependency-free. Its jar is copied
into every plugin that uses any part of it, so a dependency
added here is imposed on all of them - including plugins
that only wanted one unrelated helper. Put code that needs
a library in the plugin that needs it.
</message>
</bannedDependencies>
</rules>
<fail>true</fail>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>