【问题标题】:How to set a property in java code using build.xml如何使用 build.xml 在 java 代码中设置属性
【发布时间】:2014-12-30 05:45:26
【问题描述】:

我是 Ant 新手,我们将不胜感激。

我想做的是:

当我调用 Ant 目标时,我正在做:

ant -DSIMV3.1=true run-tenantManagement

现在在 build.xml 中,我有:

<target name="run-tenantManagement" depends="jar">
   <property name="SIMV3.1" value="${SIMV3.1}" />
    ...
</target>

现在我希望属性 SIMV3.1 的值在我的 java 代码中可见。 因为在我的java代码中,我想设置一个条件:

if(SIMV3.1==true){
//do something
}else{
//do something else
}

请帮忙。

【问题讨论】:

  • 您希望变量在编译时可用还是在运行时可用?也就是说,run-tenantManagement 使用 &lt;java&gt; 还是 &lt;javac&gt;

标签: java ant


【解决方案1】:

就目标构建(即生成的 jar 文件)中的属性值而言,另一种更持久的方法是让 ant 将属性值写入目标 jar 文件中包含的资源文件。这为在构建期间设置的属性值提供了更好的生命周期(因为缺少更好的词),以便可以在项目的(即构建的)产品中使用它。例如,一个示例 ant 文件可能如下所示:

<project name="sandbox" basedir="." default="build">
    <condition property="SIMV3.1" value="${SIMV3.1}" else="false">
        <isset property="SIMV3.1"/>
    </condition>

    <target name="clean">
        <delete verbose="${verbose}" dir="bin" failonerror="false"/>
        <delete verbose="${verbose}" file="lib/sandbox.jar" failonerror="false"/>
    </target>

    <target name="compile">
        <mkdir dir="bin"/>
        <javac srcdir="src" destdir="bin"/>
    </target>

    <target name="resources">
        <echo file="bin/sandbox/resources/SIMV3.1">${SIMV3.1}</echo>
    </target>

    <target name="build" depends="compile, resources">
        <mkdir dir="lib"/>
        <jar destfile="lib/sandbox.jar" basedir="bin">
            <manifest>
                <attribute name="Main-Class" value="sandbox.Sandbox"/>
            </manifest>
        </jar>
   </target>
</project>

condition 任务将属性值默认为 false(如果未提供),resources 任务会将属性值写入将包含在 jar 文件中的资源文件(在 build 任务中)。因此像这样构建:

ant -DSIMV3.1=true

将导致将“真”值写入 resources 包中的 SIMV3.1 文件。在不指定属性的情况下调用 ant 将导致将默认属性 false 写入该资源文件。

在代码中,可以通过 InputStream 访问该资源,方法是从文件中读取第一(也是唯一)行并使用 Boolean 类解析该行,如下所示:

package sandbox;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class Sandbox {

    public static void main(String[] args) {

        String resource = "/sandbox/resources/SIMV3.1";
        InputStream stream = Sandbox.class.getResourceAsStream(resource);
        InputStreamReader reader = new InputStreamReader(stream);
        BufferedReader buffer = new BufferedReader(reader);
        boolean simv3_1 = false;

        try {

            simv3_1 = Boolean.parseBoolean(buffer.readLine());
        }
        catch (IOException e) {

            e.printStackTrace();
        }

        System.out.println("SIMV3.1 = " + simv3_1);
    }
}

【讨论】:

    【解决方案2】:

    你可以在java ant任务中使用sysproperty来设置属性。

    <target name="run-tenantManagement" depends="jar">
        <java classname="props"    fork="true">
            <sysproperty key="SIMV3.1"
                 value="${SIMV3.1}"
                 />
        </java>
    </target>
    

    这可以在下面的java类中读取,

    import java.util.Properties;
    public class props {
        public static void main( String[] args )
        {
            String     testProp = "SIMV3.1";
            Properties sysProps = System.getProperties();
            System.out.println( "Value of " + testProp + " is " +
                            sysProps.getProperty(testProp) );
        }
     }
    

    【讨论】:

    • 是否有必要在 main() 中打印它的值?如果我将它打印为一些构造函数/其他方法,它就会为空
    • 不,我仅使用 main 作为示例。您确定要访问与 java 任务 ("props" ..) 中的类名属性中提到的同一 java 类中的属性吗?
    • 我错过了这个异常。我在线程 "main" java.lang.NoClassDefFoundError: com/oracle/common/Constants [java] 中遇到异常 原因:java.lang.ClassNotFoundException: com.oracle .common.Constants
    • 这是不言自明的,您错过了包含类路径来查找常量类。您可以创建类路径并在 java 任务中引用它。 PS:此异常与此线程无关。请坚持该线程所针对的问题。如果您遇到困难并需要帮助,您可以提出单独的问题
    • 我已经解决了类路径问题,但现在我在线程“main”中遇到异常 java.lang.NoSuchMethodError: main 那么,为什么要寻找 main 方法?
    猜你喜欢
    • 2014-06-23
    • 2015-10-07
    • 1970-01-01
    • 2012-10-30
    • 2011-07-12
    • 1970-01-01
    • 2011-07-31
    • 2011-10-17
    • 2010-11-03
    相关资源
    最近更新 更多