Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaAnt构建了多个版本的软件_Java_Ant - Fatal编程技术网

JavaAnt构建了多个版本的软件

JavaAnt构建了多个版本的软件,java,ant,Java,Ant,假设我有一个软件,我把它作为两个版本销售 如何使用Ant构建这两个版本 我的意思是,在代码内部,据我所知,我会检查例如: if(Editions.PRO) { // 'Pro' edition code } else { // 'Normal' edition code } 而且,由于Editions.PRO是“静态最终布尔值”,因此将只编译上述代码的一部分 我也可以使用不同的源文件,但这听起来很难维护。 我也可以使用接口,但那是。。。。。。纳米 因此,“条件编译”(上文)方法

假设我有一个软件,我把它作为两个版本销售

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

我的意思是,在代码内部,据我所知,我会检查例如:

if(Editions.PRO)
{
    // 'Pro' edition code
}
else
{
    // 'Normal' edition code
}
而且,由于Editions.PRO是“静态最终布尔值”,因此将只编译上述代码的一部分

我也可以使用不同的源文件,但这听起来很难维护。
我也可以使用接口,但那是。。。。。。纳米

因此,“条件编译”(上文)方法在我看来是最好的。
我将如何在Ant上实现这一点

Ant能否操纵其文件中“Editions.PRO”的值?
对我来说,这听起来不是很好。
相反,我想替换文件(使用Ant命令),或者更好地,排除定义“Editions.PRO”的(real,dev)文件,并添加另一个文件夹作为类路径,该文件夹具有相同的文件,但相应地配置了“Editions.PRO”(到所需的版本)。。。。我希望我明白了


您是如何做到这一点的?

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

然后创建两个ant目标,一个“专业”目标和一个“演示”目标。然后,每个目标都会排除抽象接口的非特定于版本的实现的编译或打包(取决于您希望在何处进行区分)

这样,您只能通过专业产品获得专业实现,通过演示产品获得演示实现,等等


尝试在if语句中嵌入功能的路径错误。如果这样做,为了编译代码,您需要同时使用pro和demo代码来构建pro或demo产品。此外,您(可能)需要在演示产品中附带这两组代码。这使得有人可能会破坏您的pro/demo选择机制,并在演示产品中激活pro版本代码。

首先,找到一种方法来重新构造代码,其中有“pro Edition”类和“demo Edition”类共享一个共同的界面,剩下的代码通过接口调用变量功能

然后创建两个ant目标,一个“专业”目标和一个“演示”目标。然后,每个目标都会排除抽象接口的非特定于版本的实现的编译或打包(取决于您希望在何处进行区分)

这样,您只能通过专业产品获得专业实现,通过演示产品获得演示实现,等等


尝试在if语句中嵌入功能的路径错误。如果这样做,为了编译代码,您需要同时使用pro和demo代码来构建pro或demo产品。此外,您(可能)需要在演示产品中附带这两组代码。这使得有人可能会破坏您的pro/demo选择机制,并在演示产品中激活pro版本代码。

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


如果您真的想让用户了解一些特性,那么需要将代码重构为两个不同的前端,以生成一些常见的后端代码。然后在
javac
任务的文件集中使用Ant的排除属性,为您正在构建的版本排除适当的前端。每个版本都可以有一个单独的目标。

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


如果您真的想让用户了解一些特性,那么需要将代码重构为两个不同的前端,以生成一些常见的后端代码。然后在
javac
任务的文件集中使用Ant的排除属性,为您正在构建的版本排除适当的前端。每个版本都可以有一个单独的目标。

在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_模式是类中的公共静态最终布尔变量

还有两件事对你很有用:

您可以在目标中设置条件属性指定:

<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 config的生产软件中可见。此外,生产代码混淆了,开发没有混淆,因此后者会抛出可读的堆栈跟踪,例如。

在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>

演示模式=