gpt4 book ai didi

java - 由于 jar 文件,Cygwin 终端在运行 .sh 文件时出错

转载 作者:太空宇宙 更新时间:2023-11-04 09:24:11 25 4
gpt4 key购买 nike

我正在尝试从 .sh shell 脚本文件为我的 java 代码运行 .jar 文件。 jar 文件名包含“.”这使得 Cygwin 终端认为它是一个目录。这是命令和结果:

java -jar ./lib/javax.json-1.0.jar

结果:

no main manifest attribute, in lib\javax.json-1.0.jar

然后:

error: package javax.json does not exist
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: error: package javax.json does not exist
import javax.json.Json; (With this ^ below the '.')
AND:
.\src\TimeTester.java:159: error: cannot find symbol
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: error: package javax.json does not exist
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) 不起作用,它给出以下错误:

Error: Could not find or load main class TimeTester

非常感谢您的帮助!

最终编辑:
感谢 Jim,shell 脚本现在可以运行了。现在我得到一个 java 执行错误:

java.io.FileNotFoundException: .\in_input\in.txt (The system cannot find the path specified)

谢谢

最佳答案

TL;DR 由于 bash 之间的命令行 shell 约定冲突,将 Cygwin 与为 Windows 编写的程序一起使用是一件痛苦的事情和 cmd.exe。要编译和运行 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 风格的 shell 模拟器与 Windows JVM 混合使用。用于 shell 的路径必须保持 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 进行转换。

关于java - 由于 jar 文件,Cygwin 终端在运行 .sh 文件时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38406197/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com