2008-11-15 123 views
2

我试图使用以下命令行语法运行基于java的工具:java -cp archive.jar archiveFolder.theMainClassName.Although类正在搜索,一个主类,“theMainClassName”在archive.jar中,并在输入给出的archiveFolder中,我不断收到我的类没有看到的错误。有人对这个问题有任何想法吗?预先感谢您从Jar文件中读取类的Java命令行问题

+0

运行命令`jar tf `并发布结果。 剪切并粘贴您正在使用的确切命令行,以及java命令输出的确切错误消息。 – erickson 2008-11-15 22:22:13

回答

5

这里是什么工作一个具体的例子,这样你可以比较自己的SI tuation。

把这段代码放在任何地方,放在一个名为MainClass.java的文件中。 (我假设一个目录中称为src后通常你会安排源到包匹配,当然。)

package archiveFolder; 

public class MainClass 
{ 
    public static void main(String[] args) 
    { 
     System.out.println("I'm MainClass"); 
    } 
} 

然后运行这些命令:

# 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文件的?代码是否在适当的包中?

1

也许与java -jar archive.jar

当然,假设清单指向正确的类...

你应该给你得到了确切的消息,它可能会摆脱更多的光。

编辑:有关在jar清单文件中设置应用程序入口点(主类)的信息,请参见Working with Manifest Files: The Basics

+0

这实际上并没有回答这个问题......他不是试图运行jar而是jar中的特定类。这几乎肯定是一个包装问题。 – 2008-11-15 22:31:39

3

确实theMainClassName类的顶部有以下包装线:

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):

$ jar -cf testJar.jar org/jc/tests/*.class 
$ java -cp testJar.jar org.jc.tests.TestClass 
1

通常当一个从属类(静态部件)没有发现发生这种情况 - 像这样,使用的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; 
    } 
} 
0

我认为其他人已经覆盖了一些常见的东西在这里。我会打开罐子,并确保列出了这个类。我还会仔细检查该类是否公开,并且方法是“public static void main(String [] arg)”。