Java命令行在从Jar存档读取类时遇到问题
我正在尝试使用命令行语法运行一个基于java的工具,如下所示:java-cp archive.jar archiveFolder.theMainClassName。尽管我正在搜索的类,一个主类“theMainClassName”在archive.jar和输入时给定的archiveFolder中,但我一直得到一个错误,即我的类没有被看到。有人对这个问题有什么想法吗?提前感谢您也许是使用Java命令行在从Jar存档读取类时遇到问题,java,command-line,Java,Command Line,我正在尝试使用命令行语法运行一个基于java的工具,如下所示:java-cp archive.jar archiveFolder.theMainClassName。尽管我正在搜索的类,一个主类“theMainClassName”在archive.jar和输入时给定的archiveFolder中,但我一直得到一个错误,即我的类没有被看到。有人对这个问题有什么想法吗?提前感谢您也许是使用java-jar archive.jar 当然,它假设清单指向正确的类 你应该给出你得到的确切信息,它可能会让你更
java-jar archive.jar
当然,它假设清单指向正确的类
你应该给出你得到的确切信息,它可能会让你更清楚
编辑:有关在jar清单文件中设置应用程序入口点(主类)的信息,请参阅。主类名类是否在顶部有以下包行:
package archiveFolder
您需要类文件与声明的包位于同一目录结构中。所以,如果你有类似的东西:
org/jc/tests/TestClass.class
其源文件必须如下所示:
package org.jc.tests;
public class TestClass {
public static void main(String[] args) {
System.out.printf("This is a test class!\n");
}
}
然后,您可以使用以下命令创建jar文件并从命令行运行它(假设当前目录位于顶层,就在org之上):
这里有一个具体的例子,说明什么是有效的,这样你就可以比较你自己的情况了 把这段代码放到任何地方,放在一个名为
MainClass.java
的文件中。(我假设稍后会有一个名为src
的目录。当然,通常您会安排源代码与包匹配。)
然后运行以下每个命令:
# Compile the source
javac -d . src/MainClass.java
# Build the jar file
jar cf archive.jar archiveFolder
# Remove the unpackaged binary, to prove it's not being used
rm -rf archiveFolder # Or rmdir /s /q archiveFolder on Windows
# Execute the class
java -cp archive.jar achiveFolder.MainClass
结果是:
I'm MainClass
您是如何构建jar文件的?代码是否在适当的包中?通常在找不到依赖类(静态成员)时会发生这种情况,如使用log4j:
public class MyClass {
private static Logger log = Logger.getLogger("com.example");
}
原因是这样一个静态成员的初始化可以理解为类加载的一部分——导致类不可用(可加载)的错误,从而导致您描述的错误
静态构造函数是另一个可能的原因:
public class MyClass {
static {
// <b>any</b> error caused here will cause the class to
// not be loaded. Demonstrating with stupid typecast.
Object o = new String();
Integer i = (Integer) o;
}
}
公共类MyClass{
静止的{
//此处产生的任何错误都将导致类
//不能加载。用愚蠢的字体演示。
对象o=新字符串();
整数i=(整数)o;
}
}
我想其他人已经介绍了一些常见的东西。我将使用jar tf jar并确保类已列出。我还要再次检查类是否为public,方法是否为“publicstaticvoidmain(String[]arg)”。运行命令jartf
,然后发布结果。剪切并粘贴您正在使用的确切命令行,以及java命令输出的确切错误消息。。。他没有试图运行jar,而是运行jar中的一个特定类。这几乎可以肯定是一个包装问题。我同意这并不能回答所问的具体问题,但其他搜索的人可能会因为他们的舱单而遭受问题。他们会遇到这个问题,所以我认为在这里有这个答案是值得的。
public class MyClass {
private static Logger log = Logger.getLogger("com.example");
}
public class MyClass {
static {
// <b>any</b> error caused here will cause the class to
// not be loaded. Demonstrating with stupid typecast.
Object o = new String();
Integer i = (Integer) o;
}
}