2012-08-23 95 views
0

这是一个典型的错误消息,但没有搜索结果可以帮助我。我正在尝试构建&运行某人编码的java工具。JAR:找不到主类

我得到以下错误:

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

您是否试图联系该软件的编码器或生产者或当前支持该代码的任何实体? –

+0

给你有来源? – Toilal

+0

是的,但他现在没有时间研究这个问题,也不知道他的头顶。 – javex

回答

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 
+0

好吧,这是一个很好的方法:我设法通过更改为'ConnJKSEngine'目录并在那里构建它。但是如果我想要在该目录之外创建它(因为更改主类没有帮助,可以看到上面的内容) – javex

+0

您可以在创建jar文件时尝试'-C'选项来更改目录。 – gkuzmin

+0

好吧,我现在这样做:'cd ConnJKSEngine && jar -cvfm ConnJKSEngine.jar ConnJKSEngineManifest * .class && mv ConnJKSEngine.jar .. && cd ..',完美地工作。感谢您的建议。我确实尝试过-C,但似乎我必须为每个文件单独执行此操作。这太多的工作,所以我会坚持下去,这是更容易:) – javex

0

如果ConnJKSEngine处于默认包(无包语句)中,则ConnJKSEngine.class和所有其他类都应位于jar文件的根目录中。

0

UPDATE

鉴于这句话

I've changed to the ConnJKSEngine directory and executed java ConnJKSEngine, it correctly prints usage information

我猜完整的类名称就是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(归档)文档

+0

我已经这样做(澄清上面的帖子) – javex

0

The manifest text file must end with a new line or carriage return. The last line will not be parsed properly if it does not end with a new line or carriage return.