我是 Linux 上使用 Java 的新手。我克隆了一个我感兴趣的存储库,但似乎无法从我的机器上运行代码。我尝试的命令是:
java -Djava.library.path=/home/myname/path/to/project -jar example.jar
我收到的错误是:
Error: Unable to access jarfile example.jar
一开始我以为是权限问题,所以我尝试使用 sudo 运行命令(出现同样的错误),我还看到一个带有引号的文件路径的示例,所以我尝试了一下,但也出现了同样的错误。
我查看了项目文件,发现实际上没有名为“example.jar”的文件。我是否应该先运行某个命令来生成它?
在此先感谢您的帮助!
答案1
是的,要运行 jar,它必须存在。
在创建它时,您必须将目录结构与包结构相匹配。
例如,您的目录可能是:
/home/ellen/proj/java/foo/example/src/example/Foo.java
/home/ellen/proj/java/foo/example/src/example/util/MyList.java
对于源文件和类文件:
/home/ellen/proj/java/foo/example/classes/example/Foo.class
/home/ellen/proj/java/foo/example/classes/example/util/MyList.class
(通常你会发现类在 ../bin/.. 而不是 ../classes/.. 命名的文件夹中,或者源文件和类文件混合在同一个目录中)
对应包结构:
package example
package example.util
然后你应该移动到层次结构的基目录:
cd /home/ellen/proj/java/foo/example/classes
或者用参数 -C 来设置,jar -C /home/ellen/proj/java/foo/example/classes ...
或者从主目录jar -C proj/java/foo/example/classes ...
作为相对路径。
例如,您可以使用以下命令创建 jar 文件:
jar -cf example.jar *.class
并使用以下方式检查:
jar -tf example.jar
请注意,有一个清单文件,它是自动生成并有用的,可作为模板,您可以在其中添加主类的信息(如果有的话),但对于语法(大写/小写、换行符)的要求非常严格。
Manifest-Version: 1.0
Created-By: 9-internal (Oracle Corporation)
Main-Class: example.Main
如果您想在不指定主类的情况下运行它,则必须添加这样的主类条目:
java -jar example.jar
否则你必须使用:
java -cp example.jar example.Main
本质上,jar 文件是一个 zip 存档,可以使用这些工具进行处理。
当您拥有多个类并且可能具有深层数据包结构时,干净地分离 src/ 和 bin/ 文件很有用。
jar -cf example.jar -C classes .
然后将从目录 classes/ 开始包含您通常需要的所有内容。(例如/类,示例/util/.class,示例/net/*class...)
jar --help
告知您有关语法的信息。