我正在尝试从.sh shell脚本文件中运行我的java代码的.jar文件。 jar文件名包含"。"这让Cygwin终端认为它是一个目录。这是命令和结果:
java -jar ./lib/javax.json-1.0.jar
结果:
在lib \ javax.json-1.0.jar
中没有主要清单属性
然后:
错误:包javax.json不存在
import 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不存在
import javax.json.Json; (用这个^在'。')下面 AND:
。\ src \ TimeTester.java:159:错误:找不到符号
private static 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不存在
import 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(系统找不到指定的路径)
由于
答案 0 :(得分:2)
TL; DR 由于bash
和{{{{}}}之间存在冲突的命令行shell约定,因此将Cygwin与为Windows编写的程序一起使用会很痛苦。 1}}。要编译和运行Java程序,最好使用Eclipse或Netbeans等IDE。
但是,如果你必须......
这一切都不起作用,因为您正在尝试将Linux样式的路径传递给Windows JVM。但是你似乎有一个更基本的误解:
cmd.exe
我猜想您认为前两个语句使编译器可以使用第三个# !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
行。事实并非如此,这两行试图执行 jar文件,当然因为jar不包含主类而失败
您应该做的是将这两个库路径作为javac
命令的-cp
选项的参数提供。
这是一个非常棘手的地方,因为您将Linux风格的shell模拟器与Windows JVM混合在一起。用于shell的路径必须保持Linux样式,而JVM将要使用的路径必须转换为Windows格式,JVM的路径字符串必须用分号(Windows样式)而不是冒号分隔( Linux风格)。这引入了更复杂的问题,因为Cygwin(Linux)中的分号是一行上多个命令的分隔符,因此必须引用路径字符串以防止分号破坏。
同样有问题的是要编译的类的命名。您没有向我们展示Java文件的包声明,但我假设它在默认包中(即没有包声明且它不是javac
)。在这种情况下,您应该位于package src;
目录中,而不是上面的一个目录。
最后,一旦指定src
,您还必须将当前目录添加到Windows上的类路径中,如果您希望包含它,否则它将找不到您新编译的-cp
文件。
所以编译和执行命令应该是
.class
对于简单的相对路径,Windows JVM将接受正斜杠,但如果您有绝对的Linux路径(即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
,或者将cygdrive路径设置为/cygdrive/c/...
,则路径如/
)JVM将无法理解它们,并且需要使用/c/user/...
进行翻译。
答案 1 :(得分:0)
你的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
。