来自终端的 运行 时 Maven MultiModule 项目错误

Maven MultiModule Project Errors When Run from terminal

我正在为神经网络创建客户端和服务器包装器。客户端读取图像并将图像发送到 运行 模型的服务器,并将结果返回给客户端。 为此,我创建了一个多模块项目。当我 运行 来自 IDE (intellij idea) 的客户端和服务器时,一切正常。但是,当我使用 Maven 构建然后从终端 运行 时,我收到错误。

我的main/parentpom.xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<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>gr.enomix</groupId>
<artifactId>imageClassificationWrapper</artifactId>
<packaging>pom</packaging>
<version>1.0</version>
<modules>
    <module>Server</module>
    <module>Client</module>
</modules>

<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </pluginManagement>
</build>

<dependencies>

    <dependency>
        <groupId>com.googlecode.json-simple</groupId>
        <artifactId>json-simple</artifactId>
        <version>1.1.1</version>
        <scope>compile</scope>
    </dependency>

    <dependency>
        <groupId>commons-cli</groupId>
        <artifactId>commons-cli</artifactId>
        <version>1.0</version>
        <type>jar</type>
        <scope>compile</scope>
    </dependency>

    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-io</artifactId>
        <version>1.3.2</version>
        <scope>compile</scope>
    </dependency>

    <dependency>
        <groupId>org.codehaus.plexus</groupId>
        <artifactId>plexus-utils</artifactId>
        <version>2.0.5</version>
        <scope>compile</scope>
    </dependency>

</dependencies>

</project>

我的服务器 pom.xml 是:

<?xml version="1.0" encoding="UTF-8"?>
<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">
<parent>
    <artifactId>imageClassificationWrapper</artifactId>
    <groupId>gr.enomix</groupId>
    <version>1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>

<groupId>gr.enomix</groupId>
<artifactId>Server</artifactId>
<packaging>jar</packaging>
<version>1.0</version>

</project>

我的客户 pom.xml 是:

<?xml version="1.0" encoding="UTF-8"?>
<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">
<parent>
    <artifactId>imageClassificationWrapper</artifactId>
    <groupId>gr.enomix</groupId>
    <version>1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>

<groupId>gr.enomix</groupId>
<artifactId>Client</artifactId>
<packaging>jar</packaging>
<version>1.0</version>

</project>

我希望父 pom.xml 的所有库都继承给子客户端和服务器。 然后我 运行 来自终端 mvn 全新安装 项目成功构建,没有任何错误。

然后最后我执行

   java -cp target/Server-1.0.jar RunServer

到运行服务器和

   java -cp target/Client-1.0.jar RunClient

给 运行 客户端,但我收到错误

Exception in thread "main" java.lang.NoClassDefFoundError:     org/json/simple/JSONObject
    at ImageHttpClient.sendImage(ImageHttpClient.java:78)
    at RunClient.main(RunClient.java:11)

来自客户端和服务器。

Exception in thread "Thread-0" java.lang.NoClassDefFoundError: org/apache/commons/io/IOUtils
    at     Handlers.ConnectionHandler.readAndSaveImage(ConnectionHandler.java:39)
    at Handlers.ConnectionHandler.run(ConnectionHandler.java:25)
    at java.lang.Thread.run(Thread.java:745)

Maven 依赖项未构建在 class 路径中??? 难道我做错了什么?? 请帮帮我,我这两天都快崩溃了...

我认为您应该在父 pom 中使用 dependencyManagement 标记,以便让子 pom 继承依赖项。

勾选这个link

differences between dependencymanagement and dependencies in maven

您的依赖项未包含在 .jar 文件中,因此无法找到它们。因此 NoClassDefFoundError

你需要做的是在你的 jar 中包含依赖项,即构建一个所谓的 "fat jar".

我不会 post 怎么做,因为 Whosebug 上已经有很多 post。正如我所看到的,您已经在评论中发表了一些意见。

编辑:要测试您的依赖项是否已包含,您可以使用 7zip 打开生成的 .jar 文件。

当您开发一个独立的 Java 应用程序时,您的依赖项全部仅用于编译阶段。当您想要 运行 您的实际代码时,Java 虚拟机需要具有 运行 您的代码的给定依赖项的地址。为此,您必须明确告诉 Java 虚拟机在哪里可以找到这些库。您可以像这样将所有库添加到 -cp 选项:

java -cp {your-maven-repository-folder}/org/apache/common/commons-io/commons-io-1.3.2.jar:target/Client-1.0.jar RunClient

其中 {your-maven-repository-folder} 通常位于您用户的主文件夹中。例如在 linux 中是 /home/mixtou/.m2/repository.

您需要指定 所有 您的依赖项,将它们与 linux 中的 : 和 windows 中的 ; 分开。

由于您已经在使用 IntelliJ,一个更简单的解决方案可能是右键单击您的 RunClientRunServer class 和 select Run .通过这样做,IntelliJ 将尝试 运行 您在 Run panel 中的项目,如果您检查 运行 输出中的第一行,您应该看到 IntelliJ 正在使用的确切命令 运行 您的代码,其中包含所有必要的库。

请记住,在独立的 Java 应用程序中,您的 jar 文件中不会包含任何依赖项。这样的选项仅适用于将在应用程序服务器上作为 warear 文件的 运行 的应用程序。当然,您可以使用一些 Maven 插件将所有库合并到您的 jar 文件(通常称为 fat jar),然后您不需要在 classpath 中指定任何内容,但是您的 jar 文件可能会变成太大(取决于您使用的库数量),因此更新会更麻烦。