簡體   English   中英

從終端運行時,Maven MultiModule項目錯誤

[英]Maven MultiModule Project Errors When Run from terminal

我正在為神經網絡創建客戶端和服務器包裝。 客戶端讀取圖像並將其發送到運行模型的服務器,然后將結果返回給客戶端。 因此,我創建了一個多模塊項目。 當我從IDE(智能想法)運行客戶端和服務器時,一切正常。 但是,當我使用Maven構建並從終端運行時,出現錯誤。

我的主要/父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">
<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 clean install運行,該項目成功構建,沒有任何錯誤。

然后最后我執行

   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依賴項不在類路徑中構建??? 難道我做錯了什么?? 請幫助我現在兩天斷頭...

您的依賴項未包含在.jar文件中,因此無法找到它們。 因此, NoClassDefFoundError

您要做的就是將依賴項包含在jar中,即構建一個所謂的“胖jar”。

我不會發布如何執行此操作,因為關於stackoverflow的帖子已經很多。 如我所見,您已經在評論中了。

編輯:要測試是否已包含依賴項,可以使用7zip打開生成的.jar文件。

我認為您應該在父pom內使用dependencyManagement標記,以便讓子pom繼承依賴關系。

檢查此鏈接

Maven中依賴管理和依賴之間的區別

在開發獨立的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類,然后選擇Run 這樣,IntelliJ將嘗試在“ Run panel運行您的項目,如果您在運行輸出中檢查了第一行,則應該看到IntelliJ用於運行代碼的確切命令,其中包括所有必需的庫。

請記住,在獨立的Java應用程序中,jar文件中不會包含任何依賴項。 此選項僅在將以warear文件形式在應用程序服務器上運行的應用程序中可用。 當然,您可以使用一些Maven插件將所有庫合並到您的jar文件(通常稱為fat jar)中,然后您無需在類路徑中指定任何內容,但是jar文件可能會變得太大(取決於(您使用的庫的數量),因此進行更新會比較麻煩。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM