【问题标题】:Lite version of a Java softwareJava 软件的精简版
【发布时间】:2009-08-12 20:26:23
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: java plugins add-in packaging


    【解决方案1】:

    正如你提到的,你可能有 2 个罐子:

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

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

    如果他们试图更改配置设置以创建真正的类,而没有真正的类的 jar,他们最终会得到 class not found 错误。

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

    至于常见的错误 - 我想你已经犯了一个 - 不过可能不是你的错 :)

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

    【讨论】:

    • 感谢您的回答。我喜欢。但是对于 crippledware 部分:正如我所说,jar 软件没有加密,所以发布完整的软件与开源(我们暂时不想要)是一样的,因为源代码可以可以使用最便宜的反编译器。瘸子软件仍然是最好的选择。
    • @Silence:我不会太担心反编译,因为这不会给你例如javadocs 和 cmets 以及大多数软件无论如何都非常庞大和复杂,以至于没有人真正有兴趣尝试了解它的工作原理:) 在我的公司中,我们发布了整个软件,并且可以通过许可证文件启用功能。这样,对我们(和客户)来说,事情就简单多了。绕过许可并不是很难,但至少对于 B2B 软件来说,这种情况很少发生。例如,想想支持。有破解版怎么获取?
    • @Silence - 如果你的产品真的是人们想要盗版的那种东西,不管你做什么,它都会发生。只需要一个人购买完整版并将其放在 bittorrent 上即可 - 游戏结束。
    • 所以......你在建议我如何做我的 crippleware 并且还建议我不要选择 crippleware 策略。现在我该怎么办? ;)
    • 有人可以添加“crippleware”作为标签吗?我认为它适合当前的问题。
    【解决方案2】:

    许多技术允许插入式功能(通常称为插件或插件)。

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

    在其启动顺序中,您的框架将查看(通过一些约定,例如在文件中)是否有插件,并让它们有机会执行自己的启动顺序,包括注册。

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

    如果您特别想要您要求的行为,我将按如下方式实现:

    • 在所有情况下都可用的菜单在框架中声明和实现
    • 仅在扩展版中可用的菜单执行两次:
      1. 在框架中,实现只会显示一条消息 (如:此功能在试用中不可用
      2. 在插件(= 付费版)中,它会用真正的实现覆盖以前的实现,这才是真正的工作。

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

    存在许多技术来实现这一点,最佳选择取决于您已经知道/使用/感觉舒适:

    • 接口实现是纯 java,插件 jar 清单中的字符串可以提及要启动的类。
    • Eclipse RCP 以这种方式完全实现了菜单(因此您无需编写任何代码,只需进行配置)
    • 使用接口时 Spring 也很不错...

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-13
        • 2012-12-12
        • 1970-01-01
        • 2019-01-20
        相关资源
        最近更新 更多