JAR:找不到主类

时间:2012-08-23 12:22:05

标签: java jar

这是一个典型的错误消息,但没有搜索结果可以帮助我。我正在努力建立和运行某人编码的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 个答案:

答案 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

以下是javac(编译器)和jar(归档器)的文档

答案 3 :(得分:0)

  

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