当使用Maven将Java代码转换为.jar文件时,我需要从Java代码中删除一个特定的函数或类。但需要注意的是,该函数或类应该保留在源代码中。有没有这样的方法,我可以使用Maven和/或任何Java实用程序来实现这一点?(有很多函数~400个,它们的实现也非常大,因此注解代码不是一个选项)
nue99wik1#
好吧,真实的的问题是:我们有一个代码库,其中包括当前未使用的某些部分,但将来可能会使用它们,因此我们希望将它们保留在代码库中,但不希望将它们发送给客户。(由于,嗯,原因。)实现这一点的最佳实践是什么?请注意,将它们注解掉是不切实际的。实现这一点的正确方法是将所有这些部件提取到一个单独的模块中,并避免运输该模块。黑客的方法是使用***硬编码的特性标志***。正常(非硬编码)特性标志是一个布尔值,它控制着我们软件的某个方面的行为。例如,如果你构建了一个mp3播放器应用程序,并且你想添加对aac文件格式的支持,但是你还不想发布对它的支持,那么你可能想创建一个boolean supportAacFeatureFlag()方法,并让所有与aac文件格式相关的代码调用该方法,并在执行任何操作之前检查返回值。需要注意的是,这必须是一个方法,而不是一个常量,这样在编译时就不知道它的值,因为每个检查常量值的if语句都会产生“condition is always true”或“condition is always false”警告。与注解掉代码相比,特性标志的最大好处在于,由特性标志控制的代码仍然必须编译,因此它必须在语义上是正确的。代码仍然会被发送,只是不会被执行。硬编码的特性标志是一个使用常量实现的特性标志。每次使用该标志时都会发出常量条件警告,因此必须全局禁用它。(这就是为什么这种方法很麻烦:使用常量的好处是它的值在编译时是已知的,所以即使编译器仍然会编译受控代码,它也不会为它发出任何字节码,所以代码实际上不会被发送给客户。2只有空函数会被发送。注意,这是Java编译器的一种行为,在C++和C#等其他语言中,编译器总是发出所有代码,你必须使用其他方法来控制代码生成,比如#define d符号,在我看来,这也是非常笨拙的。另一个我确信有些人会选择但我强烈反对的方法是将未使用的代码保留在单独的特性分支中,并将其从master分支中删除。我强烈反对这样做,因为应用于master分支的任何重构都不会影响特性分支,因此代码将出现分歧,因此将来集成它将是一场噩梦。
boolean supportAacFeatureFlag()
if
#define
1条答案
按热度按时间nue99wik1#
好吧,真实的的问题是:
我们有一个代码库,其中包括当前未使用的某些部分,但将来可能会使用它们,因此我们希望将它们保留在代码库中,但不希望将它们发送给客户。(由于,嗯,原因。)实现这一点的最佳实践是什么?请注意,将它们注解掉是不切实际的。
实现这一点的正确方法是将所有这些部件提取到一个单独的模块中,并避免运输该模块。
黑客的方法是使用***硬编码的特性标志***。
正常(非硬编码)特性标志是一个布尔值,它控制着我们软件的某个方面的行为。例如,如果你构建了一个mp3播放器应用程序,并且你想添加对aac文件格式的支持,但是你还不想发布对它的支持,那么你可能想创建一个
boolean supportAacFeatureFlag()
方法,并让所有与aac文件格式相关的代码调用该方法,并在执行任何操作之前检查返回值。需要注意的是,这必须是一个方法,而不是一个常量,这样在编译时就不知道它的值,因为每个检查常量值的if
语句都会产生“condition is always true”或“condition is always false”警告。与注解掉代码相比,特性标志的最大好处在于,由特性标志控制的代码仍然必须编译,因此它必须在语义上是正确的。代码仍然会被发送,只是不会被执行。硬编码的特性标志是一个使用常量实现的特性标志。每次使用该标志时都会发出常量条件警告,因此必须全局禁用它。(这就是为什么这种方法很麻烦:使用常量的好处是它的值在编译时是已知的,所以即使编译器仍然会编译受控代码,它也不会为它发出任何字节码,所以代码实际上不会被发送给客户。2只有空函数会被发送。
注意,这是Java编译器的一种行为,在C++和C#等其他语言中,编译器总是发出所有代码,你必须使用其他方法来控制代码生成,比如
#define
d符号,在我看来,这也是非常笨拙的。另一个我确信有些人会选择但我强烈反对的方法是将未使用的代码保留在单独的特性分支中,并将其从master分支中删除。我强烈反对这样做,因为应用于master分支的任何重构都不会影响特性分支,因此代码将出现分歧,因此将来集成它将是一场噩梦。