java ant构建了几个版本的软件

时间:2011-08-09 15:25:47

标签: java ant

假设我有一个软件,我将其作为两个版本销售。

如何使用Ant构建两个版本?

我的意思是,在代码中,据我所知,我会检查一下:

if(Editions.PRO)
{
    // 'Pro' edition code
}
else
{
    // 'Normal' edition code
}

由于Editions.PRO是“static final boolean”,因此只会编译上述代码的一部分。

我也可以使用不同的源文件,但这听起来很痛苦 我也可以使用接口,但那...... ......。

所以,“conditinoal compilation”(上述)方法对我来说似乎最好 我如何在Ant上实现它?

Ant 可以在其文件中操纵“Editions.PRO”的值吗? 这听起来对我来说听起来不太好 相反,我正在考虑替换文件(使用Ant命令),甚至更好,排除定义“Editions.PRO”和文件>添加一个类路径另一个文件夹,其中相同的文件,但相应地配置了“Editions.PRO”(到所需的版本)....我希望我很清楚

你会怎么做?

3 个答案:

答案 0 :(得分:4)

首先,找到一种重构代码的方法,其中有“PRO Edition”类和“Demo Edition”类共享一个公共接口,然后其余代码通过接口调用变量功能。 / p>

然后创建两个蚂蚁目标,一个“专业”目标和一个“演示”目标。然后,每个目标都排除了抽象接口的非版本特定实现的编译或打包(取决于您想要区分的位置)。

通过这种方式,您只能获得专业产品的实施,使用演示产品的演示实施等。

尝试在if语句中嵌入功能是错误的。如果您这样做,为了编译代码,您需要同时使用专业版和演示代码来构建专业版或演示版产品。此外,您(可能)需要使用演示产品发送这两组代码。这样就可以让一个人击败您的专业/演示选择机制并激活演示产品中的专业版代码。

答案 1 :(得分:0)

Java中没有条件编译。你所描述的是条件执行。所有代码都已编译并可供用户使用。如果您的目标是阻止用户执行一个代码路径而不执行另一个代码路径,那么这将在基本级别上运行。如果您打算通过某种许可方案来控制功能,那么很容易被击败。

如果您真的想保留用户的某些功能,则需要将代码重构为两个不同的前端到一些常见的后端代码。然后在javac任务的FileSet中使用Ant的排除属性,以排除正在构建的版本的相应前端。您可以为每个版本设置单独的目标。

答案 2 :(得分:0)

用Java代码替换令牌对我有用。 在编译任务之前我使用这样的东西:

<copy todir="${target.dir}/java" filtering="false">
    <fileset dir="${src.dir}/java"/>
</copy>
<replace dir="${target.dir}/java" value="DEMO_MODE = ${demo.mode}">
  <replacetoken>DEMO_MODE = true</replacetoken>
</replace>

首先我将Java文件复制到临时位置,然后我替换令牌。 Javac这些复制的文件。 即使在命令行或属性文件中,$ {demo.mode}也可以作为参数给出。 DEMO_MODE是类中的公共静态最终布尔变量。

另外两件对你有用的事情:

您可以在目标中设置条件属性分配:

<condition property="distribution.postfix" value="-demo" else="">
<equals arg1="${demo.mode}" arg2="true" />
</condition>

你可以使用 if 除非目标条件:

<target name="demotarget" depends="jar" if="demo.mode">
       ...
</target>

实际上,我更喜欢模块化和PRO和DEMO版本的不同目标,可能是可切换的功能,但我们将这些技巧用于其他方面,特别是开发与生产版本:开发代码包含更多我们不想要的调试日志在具有logLevel = DEBUG配置的生产软件中可见。此外,生产代码被混淆,开发不是,因此后者抛出可读的堆栈跟踪,例如。