如何在没有某些类或包的情况下导出jar,我不希望其他人使用,但是在项目中需要它,这意味着我无法删除它们。
答案 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文件,引导一个条目将反射(因为你不能对它有静态依赖)指向新的类加载器。
或者只是接受这样一个事实,即由于代码存在于某个地方,任何数量的混淆只会给每个人带来不便,并且无法隐藏任何内容。