Java主文件方法在jar文件中无法识别,但编译得很好

时间:2015-12-12 20:42:04

标签: java jar packages main javac

我要指出的第一件事是我不使用IDE。我使用Notepad ++,它有很少的帮助,我编译和运行我的所有代码从bash或DOS。在这种情况下,我尝试使用命令java -jar CharDefs.jar将Java中的文件作为可执行jar文件运行,但它始终向我发送消息:Main method not found in LispDefs.CharDefs, please define the main method as: public static void main(String[] args).

到目前为止,我已经浏览了Oracle网站上的教程并创建了一个清单文件,方法是创建一个名为Manifest.txt的文本文件,其中包含行Main-Class: LispDefs.CharDefs和回车符。 我将这个包含在我的jar文件中,其命令为jar cfm LispDefs.jar Manifest.txt LispDefs/*.class,如他们的教程所示。 文件创建成功,但它仍然给我留言。但是,当我编译没有包头的文件并单独使用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;
    }
}

我想要做的是创建一个包含不同类的包,这些类允许不同层次的LISP样式列表解析方法,这些方法可以在不同程序中一般应用。现在,我只是试图自己测试运行它,但是它没有在jar可执行文件中识别我的主要方法。我阅读其他文章并尝试了各种各样的事情,似乎可能存在某种语义错误或者我也许没有注意到的事情。我不习惯Java,因为我将这个概念移植到python上。

2 个答案:

答案 0 :(得分:0)

可能您的Manifest.txt文件未以换行结束。

解决问题的另一种方法是使用该命令创建带有清单的JAR:

jar cfe jar-file main-class input-file(s)

然后会自动创建Manifest个文件。因此,在您的情况下,此命令可能如下所示:

jar cfe LipsDefs.jar CharDefs *

或者如果你有包裹:

jar cfe LipsDefs.jar LispDefs.CharDefs LispDefs/*

您可以在此处找到更多信息https://docs.oracle.com/javase/tutorial/deployment/jar/appman.html

答案 1 :(得分:0)

看起来你误读或掩盖了一些&#34;可执行jar&#34;是的。

首先,您有一个源目录,其中包含源文件(名称以StaggeredGridLayoutManager结尾的文件,具有适当的目录结构;我知道您知道的很多)。

您需要做的是将源目录中的这些文件编译到目标目录(这可能是相同的);此外,在您的一个源目录中,您应该有一个名为(相对)的文件:

.java

在该文件中,有一行显示:

META-INF/MANIFEST.MF

其中:

Main-Class: relative.path.to.MyMainClass

使用原型的relative/path/to/MyMainClass.java方法:

main

所以,基本过程是:

  • 知道您的源目录是什么,public static void main(String... args) // or String[] args文件的位置;
  • 知道您的目的地目录是什么;
  • 适当地发布编译过程;手动复制目标目录中未由编译过程处理的文件(这包括.java );
  • 从目标目录中创建一个jar。

总而言之,构建目录的内容应为:

  • META-INF / MANIFEST.MF(至少包含Main-Class);
  • ** / * .class(您编译的Java文件)。

你应该能够制作一个&#34;可执行的jar&#34;出来的。

当然,如果你有外部依赖,那么问题就比那复杂......