在jar文件中隐藏一些类文件或包

时间:2010-12-03 04:23:35

标签: java jar

如何在没有某些类或包的情况下导出jar,我不希望其他人使用,但是在项目中需要它,这意味着我无法删除它们。

4 个答案:

答案 0 :(得分:3)

这没有多大意义。

如果需要编译项目的类,那么其他类中可能存在静态依赖项。 (否则......你可以删除它/它们。)

但是如果这些类存在静态依赖关系,那么除非这些类存在于JAR文件中,否则您将无法运行应用程序。如果你将这些类从JAR中删除以阻止人们使用它们(或其他任何东西),你的应用程序将在启动时因“未找到类”而死亡。

如果您想阻止人们直接使用这些课程,您可以尝试以下方法:

  • 将类访问权限更改为“package private”。这不会使它们无法使用,但这会使它变得更加困难。

  • 更改项目,使类的依赖关系完全动态化;例如通过Class.forName(...)或依赖注入。然后,您可以根据需要从JAR中排除类。但是再一次,如果你的应用程序需要使用这些类,那么它们必须在运行时(某种程度上)可访问,因此可以(某种方式)让其他人掌握它们。

  • 更改项目以允许您完全删除类。这是唯一可靠的解决方案。

最后,在你解决所有这些问题之前,你应该问问自己为什么你甚至不愿意这样做。你为什么不让人们使用这些课程呢?什么是阻止他们从其他地方获取类...或从头开始实现他们自己的版本?

答案 1 :(得分:2)

如果您的程序需要使用该类,则无法从JAR中省略它。

您可以将类放在名称中包含“internal”之类的包中 - 例如com.example.internal - 表示这些类不适合其他人使用或依赖。它不能阻止任何人为了自己的目的使用你的类,但它至少表明他们这样做是冒着自己的风险,你的内部接口可能会在程序的未来版本中改变,等等

答案 2 :(得分:1)

一种简单的方法是对类使用包私有访问修饰符。这将使其他人难以访问这些类,但它也会影响您从其他包中使用它们的能力。

更高级的方法是使用OSGi并仅发布您希望其他人使用的类。这将使其他人无法访问课程,同时不限制您访问课程。

答案 3 :(得分:0)

将它们放入一个单独的jar文件中,将该jar文件(作为单个文件,可能带有一个非描述名称)包含到您的jar文件中,创建一个自定义类加载器以从您的代码中打开该嵌入式jar文件,引导一个条目将反射(因为你不能对它有静态依赖)指向新的类加载器。

或者只是接受这样一个事实,即由于代码存在于某个地方,任何数量的混淆只会给每个人带来不便,并且无法隐藏任何内容。