![](/img/trans.png)
[英]Running a jar file from cygwin is throwing error where from commad prompt it is running, why? (in windows)
[英]Cygwin terminal error in running .sh file because of a jar file
我正在嘗試從.sh shell腳本文件為Java代碼運行.jar文件。 jar文件名包含“。” 使Cygwin終端認為它是目錄。 這是命令和結果:
java -jar ./lib/javax.json-1.0.jar
結果:
lib \\ javax.json-1.0.jar中沒有主清單屬性
然后:
錯誤:程序包javax.json不存在
導入javax.json.Json;
在句點下(在javax之后)帶有此標記^。
我該如何解決? 我正在Windows 10上工作。謝謝!
編輯:
我已經編寫了多種形式的.sh文件來運行它,但是它不會運行。 當前的是:
# !bin/bash
java -jar ./lib/javax.json-1.0.jar
java -jar ./lib/javax.json-api-1.0.jar
javac ./src/TimeTester.java
java TimeTester
這樣看起來好嗎?
我收到以下錯誤:
。\\ src \\ TimeTester.java:22:錯誤:軟件包javax.json不存在
導入javax.json.Json; (在“。”下的此^)
和:
。\\ src \\ TimeTester.java:159:錯誤:找不到符號
私有靜態JsonObject getJsonFromString(String jsonStr){
錯誤中還有許多類似的行..有幫助嗎?
編輯2:
這是我當前的文件:
javac -cp ./lib/javax.json-1.0.jar:./lib/javax.json-api-1.0.jar ./src/TimeTester.java
java -cp ./lib/javax.json-1.0.jar:./lib/javax.json-api-1.0.jar:./src TimeTester
但我得到:
。\\ src \\ TimeTester.java:22:錯誤:軟件包javax.json不存在
導入javax.json.Json;
^
與最后一個點(.Json)下的(^)
編輯3:
當前的.sh文件是:
#!/usr/bin/env bash
cd src
javac -cp '../lib/javax.json-1.0.jar;../lib/javax.json-api-1.0.jar' TimeTester.java
java -cp '../lib/javax.json-1.0.jar;../lib/javax.json-api-1.0.jar' TimeTester
第一個命令(javac)工作並生成.class文件。 但是,第二個命令(java)不起作用,並且出現以下錯誤:
錯誤:找不到或加載主類TimeTester
非常感謝您的幫助!
最終編輯:
感謝Jim,shell腳本現在可以使用了。 現在我收到一個Java執行錯誤:
java.io.FileNotFoundException:。\\ in_input \\ in.txt(系統找不到指定的路徑)
謝謝
TL; DR由於Cybwin與bash
和cmd.exe
之間的命令行外殼約定沖突,因此很難將Cygwin與為Windows編寫的程序一起使用。 要編譯和運行Java程序,最好使用Eclipse或Netbeans之類的IDE。
但是,如果您必須...
這些都不起作用,因為您試圖將Linux樣式的路徑傳遞給Windows JVM。 但是,您似乎有一個更基本的誤解:
# !bin/bash
java -jar ./lib/javax.json-1.0.jar
java -jar ./lib/javax.json-api-1.0.jar
javac ./src/TimeTester.java
java TimeTester
我推測您認為前兩個語句使庫可用於第三javac
行的編譯器。 這是不正確的,這兩行嘗試執行 jar文件,因為jar不包含主類,所以這當然會失敗
您應該做的是提供這兩個庫路徑作為javac
命令的-cp
選項的參數。
這是非常棘手的地方,因為您將Linux樣式的外殼仿真器與Windows JVM混合使用。 用於外殼程序的路徑必須保持Linux樣式,而將由JVM使用的路徑必須轉換為Windows格式,並且JVM的路徑字符串必須用分號(Windows樣式)而不是冒號( Linux樣式)。 由於Cygwin(Linux)中的分號是一行上多個命令的定界符,因此這會帶來進一步的復雜性,因此必須用引號引起來以防止分號破壞內容。
還有一個問題是要編譯的類的命名。 您沒有向我們顯示Java文件的軟件包聲明,但是我假設它在默認軟件包中(即,沒有軟件包聲明,也不是package src;
)。 在這種情況下,您應該位於src
目錄中,而不是上面的目錄中。
最后,一旦指定了-cp
,還必須將當前目錄添加到Windows上的類路徑中,如果要包含它,否則它將找不到您新編譯的.class
文件。
所以編譯和執行命令應該是
javac -cp '../lib/javax.json-1.0.jar;../lib/javax.json-api-1.0.jar' TimeTester.java
java -cp '.;../lib/javax.json-1.0.jar;../lib/javax.json-api-1.0.jar' TimeTester
對於簡單的相對路徑,Windows JVM將接受正斜杠,但是如果您具有絕對的Linux路徑(即/cygdrive/c/...
或cygdrive路徑設置為/
,則路徑應為/c/user/...
) JVM無法理解它們,因此需要使用cygpath
對其進行翻譯。
您的4個命令都不起作用:
java -jar ./lib/javax.json-1.0.jar
無效,因為javax.json-1.0.jar
不是可執行的jar文件。
java -jar ./lib/javax.json-api-1.0.jar
無效,因為javax.json-api-1.0.jar
不是可執行的jar文件。
javac ./src/TimeTester.java
不起作用,因為您的類要求javax.json
包中的類位於類路徑上,並且您尚未設置類路徑。 javax.json
包中的類位於javax.json-1.0.jar
文件中。
java TimeTester
不起作用,因為編譯失敗。
要解決所有問題,請刪除前兩行,並在其他兩行上指定類路徑,例如
javac -cp ./lib/javax.json-1.0.jar:./lib/javax.json-api-1.0.jar ./src/TimeTester.java
java -cp ./lib/javax.json-1.0.jar:./lib/javax.json-api-1.0.jar:./src TimeTester
請注意,執行程序時,還必須在類路徑上列出./src
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.