当前位置: 首页 > 知识库问答 >
问题:

java - maven本地父子工程,对依赖其他子模块的子模块进行打包,可以不经过本地仓库吗?

松智勇
2024-07-03

新建maven父子工程,然后新建子模块A和子模块B,在A模块随便写几个带有system.out.println函数代码,配置子模块B依赖子模块A,子模块B内调用子模块A的输出测试内容的函数。对子模块B进行clean package,如果不对父工程执行install,对子模块B进行clean package就会出现这个以下错误。

Could not resolve dependencies for project com.test:module-b:jar:1.0.1: The following artifacts could not be resolved: com.test.module-a:jar:1.0.1: Could not find artifact com.test:module-a:jar:1.0.1 in alimaven (http://maven.aliyun.com/nexus/content/repositories/central/)

由于com.test.module-a没有安装到本地仓库,然后不知道为什么maven去阿里云的maven仓库去找了,但com.test.module-a是同属父模块下的子模块。

为什么对子模块进行clean package,打包过程中对父子工程的模块之间引用依赖的访问加载一定要经过本地仓库或者其他远程仓库?

所以子模块B依赖子模块A。对子模块B进行clean package,子模块B依赖子模块A在关联上没有install到本地仓库中。这个情况下如何对子模块B打包成功?

验证成功条件:
把maven父子工程复制一份项目副本,把副本项目中的子模块A中带有system.out.println的函数代码中修改输出内容,然后对副本的子模块B执行clean package在部署运行,看看副本和原来的在部署输出的测试内容上是不是不一样的。

父模块:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<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>com.test</groupId>


    <artifactId>test_box1</artifactId>


    <version>1.0.1</version>


    <packaging>pom</packaging>


    <modules>


        <module>module-a</module>
        <module>module-b</module>


    </modules>


    <properties>


        <maven.compiler.source>17</maven.compiler.source>


        <maven.compiler.target>17</maven.compiler.target>


        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>


    </properties>


    <dependencyManagement>


        <dependencies>

            <dependency>
                <groupId>com.test</groupId>
                <artifactId>module-a</artifactId>
                <version>1.0.1</version>
            </dependency>

            

        </dependencies>


    </dependencyManagement>


    <dependencies>


    </dependencies>


</project>

子模块A:

<?xml version="1.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>
    <parent>
        <groupId>com.test</groupId>
        <artifactId>test_box1</artifactId>
        <version>1.0.1</version>
         <relativePath>../pom.xml</relativePath> <!-- 相对于父工程的路径 -->
    </parent>

    <artifactId>module-a</artifactId>
    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>


    </dependencies>
</project>

子模块B:

<?xml version="1.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>
    <parent>
        <groupId>com.test</groupId>
        <artifactId>test_box1</artifactId>
        <version>1.0.1</version>
        <relativePath>../pom.xml</relativePath> <!-- 相对于父工程的路径 -->
    </parent>

    <artifactId>module-b</artifactId>

    <packaging>jar</packaging>


    <properties>
        <java.version>17</java.version>
    </properties>


    <dependencies>

        <dependency>
            <groupId>com.test</groupId>
            <artifactId>module-a</artifactId>
        </dependency>

    </dependencies>
    <build>
        <finalName>module_b</finalName>
        <plugins>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>

                <configuration>

                    <source>17</source>
                    <target>17</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>


            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.2.1</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <finalName>demo</finalName>
                            <transformers>
                                <transformer
                                    implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <mainClass>start.AppStart1</mainClass>
                                </transformer>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

        </plugins>

    </build>
</project>

共有1个答案

杜楚
2024-07-03

在Maven中,模块之间的依赖关系默认是通过Maven的依赖管理机制来解决的,这通常意味着依赖的模块需要被安装到本地仓库(或者通过远程仓库解析)。但是,当你有一个包含多个模块的Maven项目(父子项目),并且你正在开发过程中(即,你还没有将这些模块发布到任何远程仓库),你可以通过配置Maven来直接在项目内部解析这些依赖,而不需要先安装到本地仓库。

为了实现这一点,你可以在父项目的pom.xml中配置<modules>元素来列出所有子模块,并确保你在命令行中从父项目的根目录运行Maven命令。这样,Maven就会知道如何解析这些子模块之间的依赖关系,而不需要通过本地或远程仓库。

在你的情况下,你应该能够直接从父项目的根目录运行mvn clean package命令来打包子模块B,而不需要先单独安装子模块A。Maven会首先构建子模块A(因为它被B所依赖),然后构建子模块B。

但是,如果你确实遇到了问题,并且Maven试图从远程仓库(如阿里云仓库)中解析子模块A,那么可能有几个原因:

  1. 你的Maven设置或项目配置可能有问题:确保你的pom.xml文件正确配置了模块依赖,并且你在父项目的根目录下运行Maven命令。
  2. Maven的多模块构建可能没有正确工作:有时,Maven可能无法正确识别多模块项目的结构。确保你的父pom.xml文件中包含了<modules>元素,并且列出了所有子模块。
  3. 你的IDE配置可能有问题:如果你在使用IDE(如IntelliJ IDEA或Eclipse),确保你的IDE项目设置正确,以便它能够识别多模块项目的结构。

为了验证你的设置是否正确,你可以尝试以下步骤:

  1. 确保你的父pom.xml文件包含了<modules>元素,并且列出了所有子模块。
  2. 在命令行中,从父项目的根目录运行mvn clean package命令。
  3. 检查构建输出,以确保Maven正确构建了子模块A,并且没有尝试从远程仓库中解析它。

如果以上步骤都不能解决问题,你可能需要进一步检查你的Maven设置和项目配置,或者考虑在Stack Overflow等社区中寻求更具体的帮助。

最后,关于你的验证成功条件,如果你按照上述步骤成功打包了子模块B,并且你能够修改子模块A中的代码并在不重新安装A的情况下重新打包B以查看更改,那么你应该已经满足了你的验证成功条件。

 类似资料:
  • 问题内容: 我是Maven的新手。我从SVN签出了具有以下结构的客户项目: “ projectName”下方的pom.xml(顶部的pom)正在构建三个模块 但是从文件夹执行时会出现以下错误 问题是:就像我的客户可能忘记使用SVN的其余模块一样,下面是否应该有pom.xml ? 问题答案: 问题是:是否应该在projectName-war下面有pom.xml 简单地说 是 。 您已经找到了窍门,并

  • 我试图创建一个由2x2网格组成的图形,其中每个象限有两个垂直堆叠的子图(即2x1网格)。不过,我似乎不知道如何实现这一点。 我得到的最接近的是使用gridspec和一些丑陋的代码(见下文),但是因为改变了所有子图的行间距,所以我仍然不在我想去的地方。 理想情况下,我想要的是,以下图为例,减少每个象限内子地块之间的间距,同时增加顶部和底部象限之间的垂直间距(即1-3和2-4之间)。 有没有办法做到这

  • 问题内容: 我的项目中有多个模块,它们直接或可传递地相互依赖。当我构建«Project A»时,有些地方«Project D»会自动构建。 «Project D»pom片段是: 在构建«Project A»时会自动构建«Project B»,根据我的理解,应该在其中一个项目中添加某个地方作为依赖项,但是在这些项目的pom下我没有发现任何字符串引用。 知道在没有子项目出现在上游项目的情况下,还有什么

  • 模块/包仓库工具 NPM Bower jspm.io spmjs

  • 我有一组非常大的maven项目,这些项目都是从我的源代码库一起签出的,对于特定的版本,我一次只更新几个项目中的代码,方法是增加pom。xml版本将成为下一个快照版本。然后我有一个父pom,它列出了pom中的所有子模块。在测试期间,我希望从父pom文件夹运行maven构建,该文件夹将只包含具有快照版本的子模块,并跳过其余部分,以便加快构建时间,更快速地将快照版本部署到repo中。 我所寻找的是类似“

  • 有种情况我们经常会遇到:某个工作中的项目需要包含并使用另一个项目。 也许是第三方库,或者你独立开发的,用于多个父项目的库。 现在问题来了:你想要把它们当做两个独立的项目,同时又想在一个项目中使用另一个。 我们举一个例子。 假设你正在开发一个网站然后创建了 Atom 订阅。 你决定使用一个库,而不是写自己的 Atom 生成代码。 你可能不得不通过 CPAN 安装或 Ruby gem 来包含共享库中的

  • 一个大项目通常由很多较小的, 自完备的模块组成. 例如, 一个嵌入式Linux发行版的代码树会包含每个进行过本地修改的软件的代码; 一个电影播放器可能需要基于一个知名解码库的特定版本完成编译; 数个独立的程序可能会共用同一个创建脚本. 在集中式版本管理系统中, 可以通过把每个模块放在一个单独的仓库中来完成上述的任务. 开发者可以把所有模块都签出(checkout), 也可以选择只签出他需要的模块.

  • 在项目开发时,你有可能经常性地想要去引用一些库文件或其它资源文件。手动的方法就是直接下载那些必要的代码文件,然后拷贝到你的项目中,最后将这些新的文件提交到你的 Git 仓库中去。 虽然这是一种有效的方法,但是这种操作并不是最简单有效的。如果只是任意地将这些库文件提交到你的项目中,将带来一系列的问题: 外部代码和自己开发的代码会被合并保存在一个项目中。其实那些库文件自身就应该是一个项目,并且也应该独