2013-03-10 113 views
3

我有一个包含我想使用的类的.jar:FooBar.class。这个类不在包中,它只是坐在.jar的根目录下。如何从不在包中的jar中导入Java类?

我已经将.jar作为库添加到项目中,但问题是,我不知道如何导入它,因为它不在包中。

如果我简单地做:import FooBar;我得到的错误:. expected,我不能使用FooBar类的任何地方,因为它说Symbol not found

任何想法?

+0

对于不在明确包中的类,您不需要import语句。 – 2013-03-10 01:01:07

+1

阅读:http://stackoverflow.com/questions/283816/how-to-access-java-classes-in-the-default-package。 – ktm5124 2013-03-10 02:24:32

回答

4

您无法从默认包中导入。无论如何,你(或任何人写的)不应该使用默认包。除了非常小的示例程序外,您应该避免使用默认包。

如果是您的代码,请将其放入包中,因为它应该是。如果是别人的话,如果他们花时间为你打发时间,他们可以把它放在一个包里。

或者,省略导入,但记得在编译时将jar添加到类路径中。

另外,如果你是懒惰的,并且不关心忽略所有的最佳实践(例如,如果这是一个玩具程序等)

$ jar -xvf <whatever>.jar 

从里面提取文件到当前目录,在此时您可以正常使用它们。如果你在Windows上,你可以通过任何程序处理.zip文件来做到这一点 - .jar只是一个带有清单的.zip文件。

0

我认为你可以用反射来做到这一点。

EDIT2:

好吧,也许你并不需要反思。我做了另一个测试,我直接实例化了Test并且它工作正常。所有你需要做的就是把jar放到你的类路径中,就像上面的海报所说的那样,而不要试图导入类文件。

编辑:为什么downvote?我绝对正确。

// No package statement here 
public class Test { 
    public String getMessage() { 
    return "Hello World!"; 
    } 
} 

$ javac Test.java 
$ jar cvf my.jar Test.class 

// No import statements needed 
public class TestRefl { 
    public static void main(String[] args) throws Exception { 
    Class c = Class.forName("Test"); 
    Test t = (Test) c.newInstance(); 
    System.out.println(t.getMessage()); 
    } 
} 

$ javac TestRefl.java 
$ java -classpath ".:my.jar" TestRefl 
$ Hello World! 

您甚至不必从默认包中导入该类。现在你有一个实例,所以你可以做任何你想做的事情。

+0

-1为疯狂的建议使用反射。删除这个废品! – Ingo 2013-03-10 02:04:24

+1

阅读:http://stackoverflow.com/questions/283816/how-to-access-java-classes-in-the-default-package。因此,您可能无法从命名包中访问默认包。可能有些情况下没有反思是不可能的。 – ktm5124 2013-03-10 02:17:38

+1

+1,因为我不同意倒票。显然,问题是关于如何破解一些东西。因此,一些hacky的解决方案。其中一些并不总是有效,但就如何解决这个问题给出了一些想法。 – ATrubka 2013-03-10 03:12:50