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

时间:2018-01-01 09:44:23

标签: java maven

鉴于以下Maven项目:

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

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

  1. 构建“当前项目”时构建root-project及其子模块。我不介意这是哪个项目,可能是root-projectserver
  2. 运行“当前项目”时运行server
  3. 这样,我可以从单个点启动所有项目范围的操作,而不必在两个项目之间进行上下文切换。

    我尝试在maven-exec-plugin配置root-project来执行此操作,但<classpath/>解析为root-project的类路径,而不是所需的server类路径。

    我想知道是否可以从另一端接近这一点(在maven-compiler-plugin中配置server以构建root-project及其依赖项)但我不知道如何这样做。我也担心这可能会导致无休止的循环root-project尝试构建serverserver尝试构建root-project

1 个答案:

答案 0 :(得分:0)

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

我已经从https://github.com/johanwitters/stackoverflow-mavenExec

创建了一个项目
  • 父级:stackoverflow-mavenExec
  • 子模块1:数据库
  • 子模块2:服务器

模块&#34;数据库&#34;有一个类com.johanw.stackoverflow.database.Database定义为:

package com.johanw.stackoverflow.database;

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

模块&#34;服务器&#34;取决于模块&#34;数据库&#34;。

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

模块&#34;服务器&#34;有一个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>

这将运行来自&#34; server&#34;的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);
    }
}

你提到过&#34;我不介意这是哪个项目,它可能是root-project或server&#34;。因此,为了使上述工作,您需要构建根项目。当你这样做时,root(父)项目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

我希望这会有所帮助。