[英]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
文件。
在開發獨立的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,所以一個更簡單的解決方案是右鍵單擊RunClient
或RunServer
類,然后選擇Run
。 這樣,IntelliJ將嘗試在“ Run panel
運行您的項目,如果您在運行輸出中檢查了第一行,則應該看到IntelliJ用於運行代碼的確切命令,其中包括所有必需的庫。
請記住,在獨立的Java應用程序中,jar文件中不會包含任何依賴項。 此選項僅在將以war
或ear
文件形式在應用程序服務器上運行的應用程序中可用。 當然,您可以使用一些Maven插件將所有庫合並到您的jar文件(通常稱為fat jar)中,然后您無需在類路徑中指定任何內容,但是jar文件可能會變得太大(取決於(您使用的庫的數量),因此進行更新會比較麻煩。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.