Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
jar文件中未识别Java主方法,但编译良好_Java_Jar_Packages_Main_Javac - Fatal编程技术网

jar文件中未识别Java主方法,但编译良好

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

我想指出的第一件事是,我不使用IDE。我使用记事本+,它几乎没有帮助,我从bash或DOS编译并运行所有代码。在本例中,我试图使用命令
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,而不是如何实际尝试和编译这些内容;显示完整的进程代码。你可以大大简化这些方法。您需要发布清单文件和JAR文件列表。具体来说,可以删除
lChar()
中的第二个
if
,以及
rChar()
中的
if
s两个
if
。@Marqueisoflorne我不再有权访问此代码,但当时没有比这更多的内容。因此,我可能会在某个时候重新启动这个项目,并将此帖子用作所用代码的基础。我意识到这有点奇怪。我写这篇文章的时候有点固执,当时我有一种特殊的做事方式,基本上是试图直接模仿汇编和LISP等语言,并抛弃了现代语言中使用的编码约定。因此,多重if语句模仿了数字电子技术中的方式和/或,我讨厌try/catch。不完全如此。他需要的是
LispDefs/*.class
,而不是
*
。程序包被注释掉了。请阅读问题。其中讨论了被注释为in/out的包。