这是一个典型的错误消息,但没有搜索结果可以帮助我。我正在努力建立和运行某人编码的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
答案 0 :(得分: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
答案 1 :(得分:0)
如果ConnJKSEngine在默认包中(没有包语句),则ConnJKSEngine.class和所有其他类应该在jar文件的根目录下。
答案 2 :(得分: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
答案 3 :(得分:0)
清单文本文件必须以新行或回车结束。 如果它不以a结尾,则不会正确解析最后一行 新线或回车。