如何从未打包的jar文件中导入一个Java类?

3
我有一个包含一个类的 .jar 文件,我想要使用 FooBar.class 这个类。这个类并不在任何一个包里面,只是直接存在于 .jar 文件的根目录下。
我已经将这个 .jar 文件作为库添加到了项目中,但问题是,由于这个类没有被放置在任何一个包里面,我不知道该如何导入它。
如果我仅仅写:import FooBar; 我会得到一个错误: . expected ,而且我无法在任何地方使用 FooBar 类,因为它报告说:Symbol not found
你有什么建议吗?

如果一个类不在显式的包中,那么你不需要导入语句。 - Code-Apprentice
1
阅读:https://dev59.com/W3VC5IYBdhLWcg3weA8-。 - ktm5124
2个回答

4
您不能从默认包中导入。您(或编写代码的人)不应该使用默认包,除非是用于非常小的示例程序。
如果这是您自己的代码,请将其放入一个包中。如果是别人的代码,如果他们会花时间把它打成jar包给你,他们也可以将其放在一个包中。
或者省略导入,但请记得在编译时将jar添加到类路径中。
另外,如果您很懒,不在乎忽略所有最佳实践(即如果这是一个玩具程序等),也可以这样操作。
$ jar -xvf <whatever>.jar

将文件从jar包中提取到当前目录,此时您可以像正常文件一样使用它们。如果您使用的是Windows操作系统,则可以通过处理.zip文件的程序来执行此操作 - .jar只是带有清单的.zip文件。


0

我认为你可以使用反射来实现这个。

编辑2:

好的,也许你不需要反射。我进行了另一个测试,在其中直接实例化了Test并且它起作用了。你所要做的就是将jar文件放在类路径中,如上面的帖子所说,而不是尝试导入类文件。

编辑:为什么要踩我?我是完全正确的。

// 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!

您甚至不必从默认包中导入该类。现在,您已经拥有了它的实例,因此您可以做任何您想做的事情。


-1 对于使用反射进行疯狂建议。删除这个废话! - Ingo
1
阅读:https://dev59.com/W3VC5IYBdhLWcg3weA8-。因此,您可能无法从命名包访问默认包。在某些情况下,可能需要使用反射才能实现。 - ktm5124
1
+1,因为我不同意负评。显然,问题是关于如何黑客某些东西的。因此,提供了许多hacky解决方案。其中一些并不总是有效,但提供了绕过问题的思路。 - ATrubka
谢谢ATrubka。希望你期待着风城的升温 :-) - ktm5124
我看不出用反射来做这件事的可能性。如果你找到了,请把它加入答案,也许踩票会消失。 - ccleve
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接