0

这是一个典型的错误消息,但没有搜索结果可以帮助我。我正在尝试构建和运行某人编写的 java 工具。

我收到以下错误:

Could not find the main class: ConnJKSEngine.  Program will exit.

这是我的清单:

Main-Class: ConnJKSEngine

我也将其更改为

Main-Class: ConnJKSEngine.ConnJKSEngine

Main-Class: ConnJKSEngine/ConnJKSEngine

(它最后有一个换行符)。没有任何区别

这就是我构建 jar 的方式:

javac -cp ConnJKSEngine/ ConnJKSEngine/ConnJKSEngine.java
jar -cvfm ConnJKSEngine.jar ConnJKSEngine/ConnJKSEngineManifest ConnJKSEngine/*.class
chmod +x ConnJKSEngine.jar

这就是我尝试运行 jar 的方式(尝试了所有这些):

java ConnJKSEngine.jar
java -jar ConnJKSEngine.jar
java -cp ConnJKSEngine.jar ConnJKSEngine

这是由给出的目录jar -tf ConnJKSEngine.jar

META-INF/
META-INF/MANIFEST.MF
ConnJKSEngine/ConnJKSEngine.class
ConnJKSEngine/ConnJKSEngine_GenKey.class
ConnJKSEngine/ConnJKSEngine_GetPubKey.class
ConnJKSEngine/ConnJKSEngine_Operation.class
ConnJKSEngine/ConnJKSEngine_PrivDec.class
ConnJKSEngine/ConnJKSEngine_Sign.class

我已更改ConnJKSEngine目录并执行java ConnJKSEngine,它正确打印了使用信息。这使我确保主类存在并且可以执行。所以建造罐子一定有问题,对吧?

所以我继续将 jar 解压到不同的目录 ( unzip ConnJKSEngine.zip) 并得到如上所示的目录结构。如果我进入ConnJKSEngine目录并执行java ConnJKSEngine,它会正确执行。

在这里我被卡住了:该类在那里,它在子目录中并且可以执行。清单似乎是正确的。由于我不是java程序员,所以我现在就来这里。知道会发生什么吗?(注:Linux系统)

编辑源代码可以在这里找到:https ://github.com/Javex/JKSEngine

4

4 回答 4

1

我认为您的主类应该具有完全限定的名称ConnJKSEngine.ConnJKSEngine,或者您的 jar 内容应该如下所示:

META-INF/
META-INF/MANIFEST.MF
ConnJKSEngine.class
ConnJKSEngine_GenKey.class
ConnJKSEngine_GetPubKey.class
ConnJKSEngine_Operation.class
ConnJKSEngine_PrivDec.class
ConnJKSEngine_Sign.class
于 2012-08-23T12:26:18.693 回答
0

如果 ConnJKSEngine 在默认包中(无 package 声明),则 ConnJKSEngine.class 和所有其他类应位于 jar 文件的根目录中。

于 2012-08-23T12:26:22.213 回答
0

更新

鉴于这句话

我已更改为 ConnJKSEngine 目录并执行了 java ConnJKSEngine,它正确打印了使用信息

我想完整的类名只是ConnJKSEngine,即没有任何包。在这种情况下,清单类需要声明

Main-Class: ConnJKSEngine

根据你的第一次尝试,但是你做了一个错误的包,即所有类必须直接放在存档中,而不是放在以项目命名的子目录中(似乎为了避免名称冲突,开发人员在每个类的实际名称前加上前缀 - 不好的做法)。因此,您需要像这样将所有 *.class 文件放在 JAR 中

META-INF/
META-INF/MANIFEST.MF
ConnJKSEngine.class
ConnJKSEngine_GenKey.class
ConnJKSEngine_GetPubKey.class
ConnJKSEngine_Operation.class
ConnJKSEngine_PrivDec.class
ConnJKSEngine_Sign.class

您可以尝试以下命令

# change to project directory
cd ConnJKSEngine
# compile every *.java file
javac *.java
# build the final archive
jar cmvf jksengine-1.0.jar ConnJKSEngineManifest *.class

这是javac (compiler) 和jar (archiver)的文档

于 2012-08-23T12:27:07.913 回答
0

清单文本文件必须以换行符或回车符结尾。如果最后一行没有以新行或回车结束,则不会正确解析。

于 2012-09-03T15:22:37.247 回答