【问题标题】:Ant The best way of excluding sensitive class filesAnt 排除敏感类文件的最佳方法
【发布时间】:2013-08-10 02:44:24
【问题描述】:

Ant 排除敏感类文件的最佳方式

经过几次试验,我发现如果代码中提到了该类,javac 将忽略排除列表,如果可以找到它仍然编译该类而不是抛出错误。

我宁愿抛出一个错误,而不是用我的敏感类编译。

我还注意到条件编译被忽略了,所以如果代码是这样的

static final boolean DEBUG = false;
//interface which TestSensitive & NormalClass implement
    ITestWrapper testWrapper = null; 

        if(DEBUG){
            testWrapper = new TestSensitive();
        }else{
            testWrapper = new NormalClass();
        }

testWrapper.print_Msg();

在 javac 的 build.xml 中

 <src path="${source.absolute.dir}" />
        <exclude name="**/Test*.java" />
        <src path="${gen.absolute.dir}" />

即使条件编译应该忽略对 testWrapper = new TestSensitive() 的调用,TestSensitive 仍在编译中。

http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.21

http://www.javapractices.com/topic/TopicAction.do?Id=64

目前,我认为可以实现我想要的唯一方法是复制 TestSensitive 类并复制到一个虚拟的空心 TestSensitive 类中。有没有更好的方法来做到这一点。

【问题讨论】:

    标签: ant javac conditional-compilation


    【解决方案1】:

    让我回答问题的非蚂蚁部分(无论如何,在你解决它之前你无法进一步前进):

    看来你在自相矛盾,你的DEBUGtrue,那么你为什么对TestSensitive 感到疑惑呢?选择的是 if 分支。

    但是,我相信对于其他类的引用,您需要在编译期间在类路径中拥有这些。我相信你不能以这种方式阻止这种情况。

    但是,有一些方法可以实现预期的行为。例如:

    • 通过反射 - 您可以使用类的名称加载类并稍后实例化/使用它,或者
    • 因为你已经有了通用接口ITestWrapper
      • 并使用一些 IOC(控制反转)概念,使用 Spring 之类的框架或
      • 通过一些类的自我注册(如侦听器)

    【讨论】:

    • 那是一个错字,应该是 DEBUG = false;
    • 好的,我的回答仍然有效
    • +1 将敏感的 cass 抽象到另一个包中,然后在运行时从另一个 jar 加载它。使用 Spring 将所有东西连接在一起。
    • 谢谢,但我想要一种 Ant 方式。 ATM 将 src 文件(不包括敏感类)复制到另一个文件夹,注释掉初始化敏感类的调用,并使用这个临时文件夹作为 javac 的源文件夹,似乎给了我想要的。
    猜你喜欢
    • 1970-01-01
    • 2012-05-10
    • 1970-01-01
    • 2013-04-01
    • 2018-06-23
    • 2011-05-17
    • 2011-12-12
    • 1970-01-01
    • 2011-01-30
    相关资源
    最近更新 更多