Создайте JAR A без зависимостей и сделайте зависимый проект C загрузкой зависимости B, от которой зависит эта зависимость A - PullRequest
0 голосов
/ 22 марта 2019

Я успешно создал jar A, который не содержит зависимостей.Эта банка А зависит от банки Б. Я не хочу создавать толстую банку.Я просто хочу, чтобы зависимый проект (назовем его C) добавил мою банку A в качестве зависимости, и как только jar A будет добавлен, проект должен извлечь банку B.

Возможно ли это?

Вопрос заканчивается здесь.Ниже приведено только то, что я пробовал до сих пор:

Что я сделал:

Сначала я создал Fat Jars как с maven, так и с gradle.Теперь у этого есть все зависимости, но мои собственные классы похоронены где-то внутри.И зависимый проект не может найти мои классы.

Затем я создал банку, которая не содержит никакой зависимости.Я создал их отдельно с Maven и Gradle.Это решило мою проблему не найденных классов.Но потом я столкнулся с другой проблемой.Как только я запускаю проект, он жалуется, что банка Б отсутствует.По праву так, как я его никогда не включал.

Я просто покажу вам мой 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>

Это создало банку без зависимостей.Я добавил его в зависимый проект C. Но он жалуется, что не может найти зависимый B (azure-servicebus в моем примере).Я надеялся, что, поскольку файл pom.xml присутствует в файле jar, зависимый проект автоматически загрузит другую зависимость.

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>

Это трассировка стека ошибки:

Причина: java.lang.ClassNotFoundException: com.microsoft.windowsazure.services.servicebus.ServiceBusContract в java.base / jdk.internal.loader.BuiltinClassLoader.loadClass (BuiltinClassLoader.java:582) в java.base / jdk.internal.loader.ClassLoaders $ AppClassLoader.loadClass (ClassLoaders)java.base / java.lang.ClassLoader.loadClass (ClassLoader.java:499) в java.base / java.lang.Class.forName0 (собственный метод) в java.base / java.lang.Class.forName (Class.java): 374) по адресу org.springframework.util.ClassUtils.forName (ClassUtils.java:275) по адресу org.springframework.boot.autoconfigure.condition.OnBeanCondition $ BeanSearchSpec.getReturnType (OnBeanCondition.jworkmepr. Org. 50)autoconfigure.condition.OnBeanCondition $ BeanSearchSpec.addDeducedBeanTypeForBeanMethod (OnBeanCondition.java:491) ... 22 общих пропущенных кадра

Эта ошибка легко исчезнет, ​​если я добавлю зависимость Azure-Servicebus к целевому проекту.Но я не хочу этого делать.Я хочу, чтобы зависимость вытащила службу Azure-Servicebus.

Вот как я вытаскиваю свою банку A в проект C.

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

Ответы [ 2 ]

1 голос
/ 22 марта 2019

Да, если A имеет зависимость Maven от B, тогда B автоматически выбирается, когда C зависит от A. Это разрешение транзитивной зависимости Maven.

Обратите внимание, что это не имеет ничего общего с толстыми банками. B не включен в A, он просто упоминается как зависимость в POM A.

0 голосов
/ 27 марта 2019

Я задал этот вопрос, не зная чего-то очень важного.

Когда jar помещается в артефакт, рядом с ним также должен быть размещен соответствующий файл .pom (вне каталога, просто посмотрите на ссылку ниже, чтобы понять структуру каталога). Этот файл pom сообщает зависимому проекту, что банку, от которой вы зависите, требуются те или иные зависимости.

Если вы выполните mvn clean install, он автоматически установит jar-файл и pom-файл в нужное вам место в вашем локальном хранилище maven.

Этот ответ помог мне понять:

https://stackoverflow.com/a/50002072/4828463

Спасибо всем, кто пытался.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...