我们的软件目前有许多功能。我被要求制作免费试用版,其中包含完整软件的轻量级版本。试用版中只有少数特定功能可用。由于jar文件未加密,我不愿意发布带有硬编码限制的完整版本。我希望能够有2个罐子:1个包含基本功能,1个包含高级功能。
功能在不同的菜单中。如果非付费用户选择高级菜单,代码会尝试在启动时加载具有额外功能的jar并显示消息(例如:此功能在试用中无法使用),这将是很好的。另一方面,有权访问高级功能jar的付费用户不会知道差异(我说的是现在,1个jar和新方法之间的区别,2个独立的jar)。
编辑:迄今为止最好的建议描述了如何做我的残疾软件,但也警告我不要做一个残疾软件。那我该怎么办?
答案 0 :(得分:2)
如你所说,你可能会有2个罐子:
1具有高级功能的基本功能和存根。 1具有实际的高级功能。
您可以使用具有配置设置的工厂类来确定是创建存根类还是实际类 - 例如“FancyFeatureClass”或“FancyFeatureClassStub”。 “FancyFeatureClassStub”将包含在“lite”发行版中,但“FancyFeatureClass”只会出现在高级功能jar中。
如果他们试图更改配置设置以创建真正的类而不使用真实类的jar,那么他们最终会得到类未找到的错误。
升级时,将高级功能jar添加到类路径并更改配置设置,以告知工厂类创建实际类而不是存根。假设你的应用程序可以这样拆分,它应该可以正常工作。
至于常见的错误 - 我认为你已经做了一个 - 可能不是你的错:但
“Crippleware”是一种评估产品的坏方法。最好发布一个带有过期或唠叨屏幕的全功能版本,而不是发布一个残缺的产品。没有这些高级功能可能会让某些人难以真正评估产品。
答案 1 :(得分:0)
许多技术都允许使用可插拔功能(通常称为插件或插件)。
这个想法是你的核心代码(或框架)声明了一些接口(一个经过深思熟虑的API是理想的)。插件可以提供接口的新实现,并将其注册到框架中。
在其引导序列中,如果有插件,您的框架将(通过某些约定,在文件中)查看,并让它们有机会执行自己的引导序列,包括注册。
在启动阶段之后,运行时示例(用于菜单):框架将其视为存储菜单的注册表。注册表包含框架自己声明的菜单,以及插件提供的任何附加内容......它显示所有这些。
如果你特别想要你所要求的行为,我会按照以下方式实现:
这样,付费用户就具有所有正常功能,试用版显示警告。
实现这一目标的技术很多,最好的选择取决于你已经知道/使用/感觉舒适的东西:
答案 2 :(得分:0)
使用单独的Jar实现付费功能(以及一个单独的精简前端,如果它获得ClassNotFoundException,则显示一个合适的消息,如'不可用')将是最简单的方法。
有许多框架,包括Eclipse RCP,用于以模块化形式分发UI应用程序 - 但这对您的需求来说太过分了。
实际上,您甚至不需要两个Jars,只要您的构建过程可以选择在您作为分发过程的一部分构建的Jar中编译/打包Java类的子集。只是不要包含付费功能。