java - 创建没有依赖的jar A,并让依赖项目C下载这个依赖A所依赖的依赖B

标签 java maven spring-boot jar

我已成功创建不包含依赖项的 jar A。这个jar A依赖于Jar B。我不想创建一个胖jar。我只希望依赖项目(我们称之为 C)将我的 jar A 添加为依赖项,并且一旦添加 jar A,项目就应该引入 jar B。

这可能吗?

问题到此结束。以下是我到目前为止所尝试过的:

我做了什么:

我首先使用 maven 和 gradle 创建了 Fat Jars。现在它具有所有依赖项,但我自己的类被埋在里面的某个地方。并且依赖项目找不到我的类(class)。

然后我创建了一个不包含任何依赖项的 jar。我用maven和gradle分别创建了它们。这解决了我的类(class)未被找到的问题。但后来我遇到了另一个问题。我一运行该项目,它就提示 jar B 丢失了。理所当然,因为我从未将其包括在内。

我只会向您展示我的 pom.xml

<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>custom-spring-boot-starter</groupId>
<artifactId>custom-spring-boot-starter</artifactId>
<version>0.0.1-SNAPSHOT</version>
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.3.RELEASE</version>
    <relativePath /> <!-- lookup parent from repository -->
</parent>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
        <scope>provided</scope>
    </dependency>
    <dependency> //THIS IS WHAT DEPENDENT PROJECT WILL NOT HAVE.
        <groupId>com.microsoft.azure</groupId>
        <artifactId>azure-servicebus</artifactId>
        <version>0.9.7</version>
    </dependency>
</dependencies>
<build>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.0</version>
            <configuration>
                <release>10</release>
            </configuration>
        </plugin>
    </plugins>
</build>

这创建了一个没有依赖项的 jar。我将它添加到依赖项目C中。但它提示找不到依赖项目B(在我的示例中是azure-servicebus)。我希望因为 jar 文件中存在 pom.xml 文件,依赖项目会自动下载另一个依赖项。

enter image description here

然后我重写了我的pom.xml:

<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>custom-spring-boot-starter</groupId>
<artifactId>custom-spring-boot-starter</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.3.RELEASE</version>
    <relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>10</java.version>
</properties>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>com.microsoft.azure</groupId>
        <artifactId>azure-servicebus</artifactId>
        <version>0.9.7</version>
    </dependency>
</dependencies>
<build>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.0</version>
            <configuration>
                <release>10</release>
            </configuration>
        </plugin>
        <plugin>
            <groupId>pl.project13.maven</groupId>
            <artifactId>git-commit-id-plugin</artifactId>
            <executions>
                <execution>
                    <id></id>
                    <goals>
                        <goal>revision</goal>
                    </goals>
                    <phase>validate</phase>
                </execution>
            </executions>
            <configuration>
                <dateFormat>yyyy-MM-dd-HH:mm:ss</dateFormat>
                <dotGitDirectory>${project.basedir}/.git</dotGitDirectory>
                <prefix>git</prefix>
                <verbose>false</verbose>
                <generateGitPropertiesFile>true</generateGitPropertiesFile>
                <generateGitPropertiesFilename>${project.build.outputDirectory}/git.properties</generateGitPropertiesFilename>
                <format>json</format>
                <gitDescribe>
                    <skip>false</skip>
                    <always>false</always>
                    <dirty>-dirty</dirty>
                </gitDescribe>
            </configuration>
        </plugin>

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <configuration>
                <archive>
                    <manifestEntries>
                        <Build-Jdk>${java.version} (${java.vendor} ${java.vm.version})</Build-Jdk>
                        <Digital-Voltage-Library-Version>${project.version}</Digital-Voltage-Library-Version>
                        <Build-Timestamp>${git.build.time}</Build-Timestamp>
                        <Build-Revision>${git.commit.id}</Build-Revision>
                        <Build-OS>${os.name} ${os.arch} ${os.version}</Build-OS>
                    </manifestEntries>
                </archive>
            </configuration>
        </plugin>
    </plugins>
</build>

这是错误的堆栈跟踪:

Caused by: java.lang.ClassNotFoundException: com.microsoft.windowsazure.services.servicebus.ServiceBusContract at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:582) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:190) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:499) at java.base/java.lang.Class.forName0(Native Method) at java.base/java.lang.Class.forName(Class.java:374) at org.springframework.util.ClassUtils.forName(ClassUtils.java:275) at org.springframework.boot.autoconfigure.condition.OnBeanCondition$BeanSearchSpec.getReturnType(OnBeanCondition.java:505) at org.springframework.boot.autoconfigure.condition.OnBeanCondition$BeanSearchSpec.addDeducedBeanTypeForBeanMethod(OnBeanCondition.java:491) ... 22 common frames omitted

如果我将 azure-servicebus 依赖项添加到目标项目,此错误很容易消失。但我不想那样做。我希望依赖项能够引入 azure-servicebus。

这就是我将 jar A 拉入项目 C 的方式。

compile fileTree(dir: '/lib', include: 'custom-spring-boot-starter-0.0.1-SNAPSHOT.jar')

最佳答案

是的,如果A对B有Maven依赖,那么当C依赖A时,B会被自动拉取。这就是Maven传递依赖解析。

请注意,这与 fat jar 无关。 B 不包含在 A 中,只是在 A 的 POM 中作为依赖项提及。

关于java - 创建没有依赖的jar A,并让依赖项目C下载这个依赖A所依赖的依赖B,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55304245/

相关文章:

java - 尝试获取代码来检查是否有偶数括号

java - @Value 注解未解析

java - Maven -> Update Project... 究竟是什么?

java - 如何防止在模板中使用环境变量?

java - 有没有办法在 Mac 上使用 Java 的快速查看实用程序?

java - 尝试提取 <html>..</html> 时,substringBetween() 返回 null

java - 让 Java Axis 在 Windows 上运行?没有发现类定义错误

java - JBoss : Timeout Exception during deployment of War File

java - 如何在某个 Spring 配置文件中禁用飞路?

java - 如何将pdf/byte[]消息阅读器添加到exchangeStrategies,不支持内容类型 'application/pdf'