Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.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
Java命令行在从Jar存档读取类时遇到问题_Java_Command Line - Fatal编程技术网

Java命令行在从Jar存档读取类时遇到问题

Java命令行在从Jar存档读取类时遇到问题,java,command-line,Java,Command Line,我正在尝试使用命令行语法运行一个基于java的工具,如下所示:java-cp archive.jar archiveFolder.theMainClassName。尽管我正在搜索的类,一个主类“theMainClassName”在archive.jar和输入时给定的archiveFolder中,但我一直得到一个错误,即我的类没有被看到。有人对这个问题有什么想法吗?提前感谢您也许是使用java-jar archive.jar 当然,它假设清单指向正确的类 你应该给出你得到的确切信息,它可能会让你更

我正在尝试使用命令行语法运行一个基于java的工具,如下所示:java-cp archive.jar archiveFolder.theMainClassName。尽管我正在搜索的类,一个主类“theMainClassName”在archive.jar和输入时给定的archiveFolder中,但我一直得到一个错误,即我的类没有被看到。有人对这个问题有什么想法吗?提前感谢您

也许是使用
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;
  }
}