java - 如何从根模块运行子模块中找到的应用程序?

标签 java maven

给定以下 Maven 项目:

  • 根项目
    • 数据库
    • 服务器

我能够配置maven-exec-plugin里面server子模块来运行其中找到的应用程序。但是,如果有人更新对等子模块(例如 database ),那么我会收到运行时错误。我想做的是有一些机制可以:

  1. 在构建“当前项目”时构建根项目及其子模块。我不介意这是哪个项目,它可能是root-projectserver .
  2. 运行 server当我运行“当前项目”时

这样,我就可以从一个点启动所有项目范围的操作,而不必在两个项目之间进行上下文切换。

我尝试配置maven-exec-pluginroot-project这样做,但是<classpath/>解析为 root-project的类路径而不是所需的 server类路径。

我想知道是否可以从另一端接近这个(在 maven-compiler-plugin 中配置 server 来构建 root-project 及其依赖项),但我不确定如何做到这一点。我还担心这可能会引发无限循环,如 root-project尝试构建serverserver尝试构建root-project .

最佳答案

我希望我正确理解了你的问题,对我来说它看起来就像任何其他项目:

我已经创建了一个可从 https://github.com/johanwitters/stackoverflow-mavenExec 获取的项目

  • 父级:stackoverflow-mavenExec
  • 子模块 1:数据库
  • 子模块 2:服务器

模块“database”有 1 个类 com.johanw.stackoverflow.database.Database 定义为:

package com.johanw.stackoverflow.database;

public class Database {
    public static String DATBASE_NAME = "The name";
}

模块“服务器”依赖于模块“数据库”。

<dependency>
    <groupId>com.johanw.stackoverflow.mavenExec</groupId>
    <artifactId>database</artifactId>
    <version>0.1-SNAPSHOT</version>
</dependency>

模块“server”有一个 exec-maven-plugin 插件,定义为:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>exec-maven-plugin</artifactId>
    <version>1.6.0</version>
    <executions>
        <execution>
            <id>install</id>
            <phase>install</phase>
            <goals>
                <goal>java</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <mainClass>com.johanw.stackoverflow.server.Test</mainClass>
    </configuration>
</plugin>

这将运行“服务器”中可用的 com.johanw.stackoverflow.server.Test 类,其定义为:

package com.johanw.stackoverflow.server;

import com.johanw.stackoverflow.database.Database;

public class Test {
    public static void main(String[]args) {
        System.out.println("Hello " + Database.DATBASE_NAME);
    }
}

您提到“我不介意这是哪个项目,它可能是根项目或服务器”。因此,为了使上述工作正常进行,您需要构建根项目。当您这样做时,根(父)项目 stackoverflow-mavenExec 使用...

mvn clean install

...它最终将运行 com.johanw.stackoverflow.server.Test 并输出

Hello The name

如下图所示:

enter image description here

如果您只想运行服务器主类,请从根目录运行以下命令。

mvn exec:java -pl server -Dexec.mainClass=com.johanw.stackoverflow.server.Test

如果您的目标是在全新安装和运行服务器之间切换,那么您可以删除服务器 pom 中 exec-maven-plugin 的定义,然后分别运行:

mvn clean install

mvn exec:java -pl server -Dexec.mainClass=com.johanw.stackoverflow.server.Test

我希望这会有所帮助。

关于java - 如何从根模块运行子模块中找到的应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48048608/

相关文章:

hibernate - 在创建 spring、hibernate with maven 时在 pom.xml 中添加依赖项时发现多个注释出现错误

java - 如何使用已标记为已提供的项目的依赖项?

maven-2 - 如何使用 maven-resources-plugin 避免二进制的 UTF-8 编码?

java - 从不同对象映射到单个字段

java - 解析路径以获取所需名称

java - 为什么将一个变量赋值给另一个变量?

spring - 摆脱 spring-boot-starter-data-mongodb 对易受攻击的 Log4J 版本的依赖

java - 检查具有 URL 的远程服务器上是否存在文件

java - Maven 找不到 persistence.xml

java - 无法使用 jre8 找到 Javac 编译器