Java JAR:找不到主类

Java JAR:找不到主类,java,jar,Java,Jar,这是一个典型的错误消息,但没有搜索结果可以帮助我。我正在尝试构建和运行一个java工具 我得到以下错误: Could not find the main class: ConnJKSEngine. Program will exit. 这是我的舱单: Main-Class: ConnJKSEngine 我也把这个改成了 Main-Class: ConnJKSEngine.ConnJKSEngine 及 (结尾有一个新行)。没有任何区别 这就是我构建jar的方式: javac -cp Co

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

我得到以下错误:

Could not find the main class: ConnJKSEngine.  Program will exit.
这是我的舱单:

Main-Class: 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的方式(尝试了所有这些):

这是由
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
目录并执行了
javaconnjksengine
,它正确地打印了使用信息。这确保了主类存在并且可以执行。所以建造这个罐子肯定有问题,对吧

因此,我继续将jar解压到另一个目录(
unzip ConnJKSEngine.zip
)中,得到了上面所示的目录结构。如果我进入
ConnJKSEngine
目录并执行
javaconnjksengine
,它将正确执行

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


Edit可以在这里找到源代码:

我认为您的主类应该有完全限定名
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

如果ConnJKSEngine在默认包中(没有包语句),那么ConnJKSEngine.class和所有其他类都应该位于jar文件的根目录下。

UPDATE 鉴于这句话

我已经切换到ConnJKSEngine目录并执行了java ConnJKSEngine,它可以正确打印使用信息

我猜完整的类名只是ConnJKSEngine(没有任何包)。在这种情况下,manifest类需要声明

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
以下是(编译器)和(归档器)的文档

清单文本文件必须以新行或回车结束。 如果最后一行没有以 新线或回车


您是否试图联系该软件的编码员或制作人或目前支持该代码的任何实体?您是否知道源代码?是的,但他目前没有时间调查此事,也不知道自己的想法。@Tailal是的,我有源代码,我在上面添加的是完全限定的类名
ConnJKSEngine
?可能是
ConnJKSEngine.ConnJKSEngine
?好的,这是一个很好的方法:我通过更改为
ConnJKSEngine
目录来构建它,并在那里构建它。但是,如果我想在该目录之外构建它(因为更改主类没有帮助,如上所示),您可以尝试
-C
选项在创建jar文件时更改目录。好的,我现在这样做:
cd-ConnJKSEngine&&jar-cvfm-ConnJKSEngine.jar-ConnJKSEngineManifest*.class&&mv-ConnJKSEngine.jar.&&cd..
,工作正常。谢谢你的建议。我确实尝试了-C的方法,但似乎我必须对每个文件分别执行此操作。这太多的工作了,所以我会坚持下去,这要容易得多:)
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