jar文件中未识别Java主方法,但编译良好
我想指出的第一件事是,我不使用IDE。我使用记事本+,它几乎没有帮助,我从bash或DOS编译并运行所有代码。在本例中,我试图使用命令jar文件中未识别Java主方法,但编译良好,java,jar,packages,main,javac,Java,Jar,Packages,Main,Javac,我想指出的第一件事是,我不使用IDE。我使用记事本+,它几乎没有帮助,我从bash或DOS编译并运行所有代码。在本例中,我试图使用命令Java-jar CharDefs.jar以可执行jar文件的形式在Java中运行一个文件,但它总是给我一条消息:Main方法未在LispDefs.CharDefs中找到,请将Main方法定义为:public static void Main(String[]args)。 到目前为止,我已经阅读了Oracle网站上的教程,并创建了一个清单文件,方法是创建一个名为m
Java-jar CharDefs.jar
以可执行jar文件的形式在Java中运行一个文件,但它总是给我一条消息:Main方法未在LispDefs.CharDefs中找到,请将Main方法定义为:public static void Main(String[]args)。
到目前为止,我已经阅读了Oracle网站上的教程,并创建了一个清单文件,方法是创建一个名为manifest.txt
的文本文件,其中包含行Main Class:LispDefs.CharDefs
和回车符。
我使用命令jar cfm LispDefs.jar Manifest.txt LispDefs/*.class
将其包含到jar文件中,如他们的教程所示。
该文件已成功创建,但它仍向我提供消息。但是,当我编译没有包头的文件并单独使用java.exe运行它时,它会成功运行。这是我的密码:
//package LispDefs;
public class CharDefs {
public static void main(String[] args) {
System.out.println(lChar("hello"));
System.out.println(rChar("hello"));
}
public static String cChar(String var1, String var2) {
return var1.concat(var2);
}
public static String lChar(String var1) {
if (var1.length() == 0) {
return new String();
}
if (var1.length() == 1) {
return String.valueOf(var1.charAt(0));
}
return String.valueOf(var1.charAt(0));
}
public static String rChar(String var1) {
if (var1.length() == 0) {
return new String();
}
if (var1.length() == 1) {
return new String();
}
String temp = new String();
for (int k = 1; k < var1.length(); k++) {
temp = temp.concat(String.valueOf(var1.charAt(k)));
}
return temp;
}
}
//包LispDefs;
公共类CharDefs{
公共静态void main(字符串[]args){
System.out.println(lChar(“hello”);
System.out.println(rChar(“hello”);
}
公共静态字符串cChar(字符串var1、字符串var2){
返回var1.concat(var2);
}
公共静态字符串lChar(字符串var1){
if(var1.length()==0){
返回新字符串();
}
if(var1.length()==1){
返回字符串.valueOf(var1.charAt(0));
}
返回字符串.valueOf(var1.charAt(0));
}
公共静态字符串rChar(字符串var1){
if(var1.length()==0){
返回新字符串();
}
if(var1.length()==1){
返回新字符串();
}
字符串温度=新字符串();
for(int k=1;k
我要做的是创建一个包含不同类的包,它允许不同层次的LISP风格的列表解析方法,这些方法可以在不同的程序中通用地应用。现在,我只是试着自己测试运行它,但它无法识别jar可执行文件中的主要方法。我读了其他文章,尝试了各种各样的方法,似乎有一些语义错误或者我没有注意到的东西。我不太习惯Java,因为我从python移植了这个概念。可能您的
Manifest.txt
文件没有以新行结尾
解决问题的另一种方法是使用该命令创建带有清单的JAR:
jar cfe jar-file main-class input-file(s)
然后将自动创建清单
文件。因此,在您的情况下,此命令可以如下所示:
jar cfe LipsDefs.jar CharDefs *
或者,如果您有套餐:
jar cfe LipsDefs.jar LispDefs.CharDefs LispDefs/*
您可以在这里找到更多信息,看起来您误读或掩盖了“可执行jar”是如何制作的一些细节 首先,您有一个源目录,其中包含您的源文件(名称以
.java
结尾的文件,具有适当的目录结构;我知道您知道很多)
您需要做的是将源目录中的那些文件编译到目标目录中(这可能是相同的);此外,在一个源目录中,您应该有一个名为(相对)的文件:
META-INF/MANIFEST.MF
在该文件中,有一行内容如下:
Main类:相对.path.to.MyMainClass
其中:
relative/path/to/MyMainClass.java
对原型具有main
方法:
publicstaticvoidmain(String…args)//或String[]args
因此,基本过程是:
- 知道你的源目录是什么,你的
文件在哪里李>.java
- 知道你的目的地目录是什么李>
- 适当发布编译过程;在目标目录中手动复制编译过程未处理的文件(这包括
)李>META-INF/MANIFEST.MF
- 从目标目录生成一个jar
- META-INF/MANIFEST.MF(至少包含主类)李>
- **/*.class(编译的Java文件)
当然,如果您有外部依赖项,那么问题就更复杂了……您告诉我们如何尝试和运行生成的jar,而不是如何实际尝试和编译这些内容;显示完整的进程代码。你可以大大简化这些方法。您需要发布清单文件和JAR文件列表。具体来说,可以删除
lChar()
中的第二个if
,以及rChar()
中的if
s两个if
。@Marqueisoflorne我不再有权访问此代码,但当时没有比这更多的内容。因此,我可能会在某个时候重新启动这个项目,并将此帖子用作所用代码的基础。我意识到这有点奇怪。我写这篇文章的时候有点固执,当时我有一种特殊的做事方式,基本上是试图直接模仿汇编和LISP等语言,并抛弃了现代语言中使用的编码约定。因此,多重if语句模仿了数字电子技术中的方式和/或,我讨厌try/catch。不完全如此。他需要的是LispDefs/*.class
,而不是*
。程序包被注释掉了。请阅读问题。其中讨论了被注释为in/out的包。