我建立了這個專案:https
://github.com/Charles92011/WebRTCJavaTest
使用 Java 的 WebRTC 庫來自:https
://github.com/devopvoid/webrtc-java
當我在 Eclipse 中執行專案時,它運行良好,我可以建立聯系。
但是當我將它匯出為可執行的 jar 檔案時,它會運行,但是一旦我嘗試連接,就會出現例外:
java.lang.NoClassDefFoundError: Could not initialize class dev.onvoid.webrtc.PeerConnectionFactory
我在 windows 10 上運行,windows 本機庫正在匯入到我的 jar 檔案中
有什么建議么?
我正在使用 Eclipse 中的 Export Jar 檔案功能構建它,并將所有需要的庫打包到 jar 檔案中。這是它創建的腳本:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project default="create_run_jar" name="Create Runnable Jar for Project WebRTCJavaTest">
<!--this file was created by Eclipse Runnable JAR Export Wizard-->
<!--ANT 1.7 is required -->
<!--define folder properties-->
<property name="dir.buildfile" value="."/>
<property name="dir.workspace" value="C:/Users/Charles Johnson/Documents/Workspaces/HelloWorld"/>
<property name="dir.jarfile" value="${dir.buildfile}"/>
<target name="create_run_jar">
<jar destfile="${dir.jarfile}/javartc1.jar" filesetmanifest="mergewithoutmain">
<manifest>
<attribute name="Main-Class" value="main.Main"/>
<attribute name="Class-Path" value="."/>
</manifest>
<fileset dir="C:/Users/Charles Johnson/Documents/GitLab/WebRTCJavaTest/target/classes"/>
<zipfileset excludes="META-INF/*.SF" src="C:/Users/Charles Johnson/.m2/repository/org/glassfish/tyrus/tyrus-server/1.17/tyrus-server-1.17.jar"/>
<zipfileset excludes="META-INF/*.SF" src="C:/Users/Charles Johnson/.m2/repository/org/glassfish/tyrus/tyrus-client/1.17/tyrus-client-1.17.jar"/>
<zipfileset excludes="META-INF/*.SF" src="C:/Users/Charles Johnson/.m2/repository/org/glassfish/tyrus/tyrus-core/1.17/tyrus-core-1.17.jar"/>
<zipfileset excludes="META-INF/*.SF" src="C:/Users/Charles Johnson/.m2/repository/org/glassfish/tyrus/tyrus-spi/1.17/tyrus-spi-1.17.jar"/>
<zipfileset excludes="META-INF/*.SF" src="C:/Users/Charles Johnson/.m2/repository/jakarta/xml/bind/jakarta.xml.bind-api/2.3.2/jakarta.xml.bind-api-2.3.2.jar"/>
<zipfileset excludes="META-INF/*.SF" src="C:/Users/Charles Johnson/.m2/repository/jakarta/activation/jakarta.activation-api/1.2.1/jakarta.activation-api-1.2.1.jar"/>
<zipfileset excludes="META-INF/*.SF" src="C:/Users/Charles Johnson/.m2/repository/org/glassfish/tyrus/tyrus-container-grizzly-client/1.17/tyrus-container-grizzly-client-1.17.jar"/>
<zipfileset excludes="META-INF/*.SF" src="C:/Users/Charles Johnson/.m2/repository/org/glassfish/tyrus/tyrus-container-grizzly-server/1.17/tyrus-container-grizzly-server-1.17.jar"/>
<zipfileset excludes="META-INF/*.SF" src="C:/Users/Charles Johnson/.m2/repository/org/glassfish/grizzly/grizzly-framework/2.3.22/grizzly-framework-2.3.22.jar"/>
<zipfileset excludes="META-INF/*.SF" src="C:/Users/Charles Johnson/.m2/repository/org/glassfish/grizzly/grizzly-http-server/2.3.22/grizzly-http-server-2.3.22.jar"/>
<zipfileset excludes="META-INF/*.SF" src="C:/Users/Charles Johnson/.m2/repository/org/glassfish/grizzly/grizzly-http/2.3.22/grizzly-http-2.3.22.jar"/>
<zipfileset excludes="META-INF/*.SF" src="C:/Users/Charles Johnson/.m2/repository/javax/websocket/javax.websocket-api/1.0/javax.websocket-api-1.0.jar"/>
<zipfileset excludes="META-INF/*.SF" src="C:/Users/Charles Johnson/.m2/repository/dev/onvoid/webrtc/webrtc-java/0.3.0/webrtc-java-0.3.0.jar"/>
<zipfileset excludes="META-INF/*.SF" src="C:/Users/Charles Johnson/.m2/repository/dev/onvoid/webrtc/webrtc-java/0.3.0/webrtc-java-0.3.0-windows-x86_64.jar"/>
<zipfileset excludes="META-INF/*.SF" src="C:/Users/Charles Johnson/.m2/repository/com/googlecode/json-simple/json-simple/1.1/json-simple-1.1.jar"/>
</jar>
</target>
</project>
uj5u.com熱心網友回復:
克隆存盤庫后,我花了 3 分鐘讓您的專案運行。MCVE總是有幫助的。??
只需添加 Maven Shade 插件:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.3.0</version>
<executions>
<execution>
<id>shade</id>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>main.Main</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
然后你會注意到:
$ mvn clean package
(...)
$ java -jar target/WebRTCJavaTest-0.0.1-SNAPSHOT.jar
Error: Unable to initialize main class main.Main
Caused by: java.lang.NoClassDefFoundError: javax/websocket/DeploymentException
通過不將 Web 套接字 API 的范圍設定為 來解決此問題provided,因為您在 JAR 中需要它:
<dependency>
<groupId>javax.websocket</groupId>
<artifactId>javax.websocket-api</artifactId>
<version>1.0</version>
<!--<scope>provided</scope>-->
</dependency>
重建,它就像一個魅力。我在我的 Windows 10 機器上進行了嘗試,在 Google Chrome 中打開了兩個瀏覽器選項卡,與自己建立了連接。當然,一個瀏覽器選項卡和鏡像模式也可以。DLL沒有問題,找到并正常使用。
我把剩下的留給你,即在創建 uber JAR 時消除由于重復清單和許可證檔案而導致的陰影警告。這可以<filters>在 Maven Shade 配置中實作,如果您只是想洗掉不需要的檔案,或者在適用的情況下使用轉換器來合并它們。否則,您可以忽略警告,插件配置中由轉換器創建的清單獲勝。
更新:這是我對您的存盤庫的拉取請求。您可以簡單地接受它來修復您的專案。
更新 2:我之前在 IntelliJ 中使用 Maven 作為領先的構建工具。現在,我還打開了 Eclipse 2022-03 并從檔案系統中匯入了專案,但沒有使用您的 Eclipse 專案設定。相反,我使用了 Maven 專案匯入向導,所以我有了一個全新的開始,知道我的修復在從命令列或 IntelliJ IDEA 使用 Maven 時有效。所以我想在 Eclipse 中做同樣的事情。
然后我使用了“檔案”、“匯出”、“可運行的 JAR 檔案”。我選擇了“將所需的庫打包到生成的 JAR 中”和“另存為 ANT 腳本”。這是結果(我用你的用戶名替換了我的用戶名,所以你可以更容易地比較):
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project default="create_run_jar" name="Create Runnable Jar for Project SO_Java_WebRTCClassNotFound_71798010 with Jar-in-Jar Loader">
<!--this file was created by Eclipse Runnable JAR file Export Wizard-->
<!--ANT 1.7 is required-->
<!--define folder properties-->
<property name="dir.buildfile" value="."/>
<property name="dir.workspace" value="${dir.buildfile}/.."/>
<property name="dir.jarfile" value="${dir.buildfile}"/>
<target name="create_run_jar">
<jar destfile="${dir.jarfile}/MyExecutable.jar">
<manifest>
<attribute name="Main-Class" value="org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader"/>
<attribute name="Rsrc-Main-Class" value="main.Main"/>
<attribute name="Class-Path" value="."/>
<attribute name="Rsrc-Class-Path" value="./ tyrus-server-1.17.jar tyrus-client-1.17.jar tyrus-core-1.17.jar tyrus-spi-1.17.jar jakarta.xml.bind-api-2.3.2.jar jakarta.activation-api-1.2.1.jar tyrus-container-grizzly-client-1.17.jar tyrus-container-grizzly-server-1.17.jar grizzly-framework-2.3.22.jar grizzly-http-server-2.3.22.jar grizzly-http-2.3.22.jar javax.websocket-api-1.0.jar webrtc-java-0.3.0.jar webrtc-java-0.3.0-windows-x86_64.jar json-simple-1.1.jar"/>
</manifest>
<zipfileset src="jar-in-jar-loader.zip"/>
<fileset dir="${dir.jarfile}/target/classes"/>
<zipfileset dir="C:/Users/Charles Johnson/.m2/repository/org/glassfish/tyrus/tyrus-server/1.17" includes="tyrus-server-1.17.jar"/>
<zipfileset dir="C:/Users/Charles Johnson/.m2/repository/org/glassfish/tyrus/tyrus-client/1.17" includes="tyrus-client-1.17.jar"/>
<zipfileset dir="C:/Users/Charles Johnson/.m2/repository/org/glassfish/tyrus/tyrus-core/1.17" includes="tyrus-core-1.17.jar"/>
<zipfileset dir="C:/Users/Charles Johnson/.m2/repository/org/glassfish/tyrus/tyrus-spi/1.17" includes="tyrus-spi-1.17.jar"/>
<zipfileset dir="C:/Users/Charles Johnson/.m2/repository/jakarta/xml/bind/jakarta.xml.bind-api/2.3.2" includes="jakarta.xml.bind-api-2.3.2.jar"/>
<zipfileset dir="C:/Users/Charles Johnson/.m2/repository/jakarta/activation/jakarta.activation-api/1.2.1" includes="jakarta.activation-api-1.2.1.jar"/>
<zipfileset dir="C:/Users/Charles Johnson/.m2/repository/org/glassfish/tyrus/tyrus-container-grizzly-client/1.17" includes="tyrus-container-grizzly-client-1.17.jar"/>
<zipfileset dir="C:/Users/Charles Johnson/.m2/repository/org/glassfish/tyrus/tyrus-container-grizzly-server/1.17" includes="tyrus-container-grizzly-server-1.17.jar"/>
<zipfileset dir="C:/Users/Charles Johnson/.m2/repository/org/glassfish/grizzly/grizzly-framework/2.3.22" includes="grizzly-framework-2.3.22.jar"/>
<zipfileset dir="C:/Users/Charles Johnson/.m2/repository/org/glassfish/grizzly/grizzly-http-server/2.3.22" includes="grizzly-http-server-2.3.22.jar"/>
<zipfileset dir="C:/Users/Charles Johnson/.m2/repository/org/glassfish/grizzly/grizzly-http/2.3.22" includes="grizzly-http-2.3.22.jar"/>
<zipfileset dir="C:/Users/Charles Johnson/.m2/repository/javax/websocket/javax.websocket-api/1.0" includes="javax.websocket-api-1.0.jar"/>
<zipfileset dir="C:/Users/Charles Johnson/.m2/repository/dev/onvoid/webrtc/webrtc-java/0.3.0" includes="webrtc-java-0.3.0.jar"/>
<zipfileset dir="C:/Users/Charles Johnson/.m2/repository/dev/onvoid/webrtc/webrtc-java/0.3.0" includes="webrtc-java-0.3.0-windows-x86_64.jar"/>
<zipfileset dir="C:/Users/Charles Johnson/.m2/repository/com/googlecode/json-simple/json-simple/1.1" includes="json-simple-1.1.jar"/>
</jar>
</target>
</project>
你看,庫是完全一樣的,我只創建了一個可執行的 JAR,所以我還有一個帶有主類的清單,以便能夠java -jar MyExecutable.jar輕松地運行程式。在我的變體中,有一個 jar-in-jar 類加載器。Maven Shade 的做法不同,將所有依賴項解壓縮到目標 JAR 中,將它們混合在一起,而不是將 JAR 打包到 uber JAR 中。相比之下,Eclipse 的可執行 JAR 更類似于您在使用Maven One Jar 插件時所獲得的。無論如何,兩種方式都有效。我從 Eclipse 匯出的 JAR 完美運行,我可以連接到另一個會話或鏡像我自己的相機。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/461582.html
