精简版Java软件

时间:2009-08-12 20:26:23

标签: java plugins add-in packaging

我们的软件目前有许多功能。我被要求制作免费试用版,其中包含完整软件的轻量级版本。试用版中只有少数特定功能可用。由于jar文件未加密,我不愿意发布带有硬编码限制的完整版本。我希望能够有2个罐子:1个包含基本功能,1个包含高级功能。

功能在不同的菜单中。如果非付费用户选择高级菜单,代码会尝试在启动时加载具有额外功能的jar并显示消息(例如:此功能在试用中无法使用),这将是很好的。另一方面,有权访问高级功能jar的付费用户不会知道差异(我说的是现在,1个jar和新方法之间的区别,2个独立的jar)。

  • 关于如何进行的任何提示?
  • 要避免常见错误的警告吗?
  • 比单独的罐子更好的策略?

编辑:迄今为止最好的建议描述了如何做我的残疾软件,但也警告我不要做一个残疾软件。那我该怎么办?

3 个答案:

答案 0 :(得分:2)

如你所说,你可能会有2个罐子:

1具有高级功能的基本功能和存根。 1具有实际的高级功能。

您可以使用具有配置设置的工厂类来确定是创建存根类还是实际类 - 例如“FancyFeatureClass”或“FancyFeatureClassStub”。 “FancyFeatureClassStub”将包含在“lite”发行版中,但“FancyFeatureClass”只会出现在高级功能jar中。

如果他们试图更改配置设置以创建真正的类而不使用真实类的jar,那么他们最终会得到类未找到的错误。

升级时,将高级功能jar添加到类路径并更改配置设置,以告知工厂类创建实际类而不是存根。假设你的应用程序可以这样拆分,它应该可以正常工作。

至于常见的错误 - 我认为你已经做了一个 - 可能不是你的错:但

“Crippleware”是一种评估产品的坏方法。最好发布一个带有过期或唠叨屏幕的全功能版本,而不是发布一个残缺的产品。没有这些高级功能可能会让某些人难以真正评估产品。

答案 1 :(得分:0)

许多技术都允许使用可插拔功能(通常称为插件或插件)。

这个想法是你的核心代码(或框架)声明了一些接口(一个经过深思熟虑的API是理想的)。插件可以提供接口的新实现,并将其注册到框架中。

在其引导序列中,如果有插件,您的框架将(通过某些约定,在文件中)查看,并让它们有机会执行自己的引导序列,包括注册。

在启动阶段之后,运行时示例(用于菜单):框架将其视为存储菜单的注册表。注册表包含框架自己声明的菜单,以及插件提供的任何附加内容......它显示所有这些。

如果你特别想要你所要求的行为,我会按照以下方式实现:

  • 所有案例中可用的菜单都在框架中声明和实施
  • 仅在扩展版中可用的菜单实施两次:
    1. 在框架中,实现只会显示一条消息 (例如:此功能在试用版中无法使用
    2. 在插件(=付费版)中,它会覆盖以前的实现,真实的工作。

这样,付费用户就具有所有正常功能,试用版显示警告。

实现这一目标的技术很多,最好的选择取决于你已经知道/使用/感觉舒适的东西:

  • 接口实现是普通的java,你的插件jar清单中的一个字符串可以提到要启动的类。
  • Eclipse RCP可以通过这种方式完全实现菜单(因此您无需编码,只需配置)
  • 当你使用接口时Spring也很不错......

答案 2 :(得分:0)

使用单独的Jar实现付费功能(以及一个单独的精简前端,如果它获得ClassNotFoundException,则显示一个合适的消息,如'不可用')将是最简单的方法。

有许多框架,包括Eclipse RCP,用于以模块化形式分发UI应用程序 - 但这对您的需求来说太过分了。

实际上,您甚至不需要两个Jars,只要您的构建过程可以选择在您作为分发过程的一部分构建的Jar中编译/打包Java类的子集。只是不要包含付费功能。