在Java中编译一行而不是另一行

在Java中编译一行而不是另一行,java,eclipse,ant,Java,Eclipse,Ant,我有一个程序,它引用了我们网络驱动器上的一个文件(“PricingMaster.omas”),但当我进行beta测试时,我会使用另一个文件(“PricingMasterBetaTest.omas”)。目前,我手动将字符串从一个更改为另一个 因此: 变成: File masterFile = new File("g:/DataTeam", "PricingMaster.omas"); 这实际上发生在几个文件中的几个地方,所以,正如您可能想象的那样,有时我会忘记,我的用户最终会非常困惑。所以我想知

我有一个程序,它引用了我们网络驱动器上的一个文件(“PricingMaster.omas”),但当我进行beta测试时,我会使用另一个文件(“PricingMasterBetaTest.omas”)。目前,我手动将字符串从一个更改为另一个

因此:

变成:

File masterFile = new File("g:/DataTeam", "PricingMaster.omas");
这实际上发生在几个文件中的几个地方,所以,正如您可能想象的那样,有时我会忘记,我的用户最终会非常困惑。所以我想知道是否有一种方法可以根据编译的目的来确定使用哪个字符串

我试着问谷歌,但我缺乏恰当表达问题的知识。在我看来,psuedo代码是这样的:

@CompileDebug
File masterFile = new File("g:/DataTeam", "PricingMasterBetaTest.omas");

@CompileRelease
File masterFile = new File("g:/DataTeam", "PricingMaster.omas");

我在Eclipse中做这个项目,所以也许这是Eclipse可以帮助我的一个技巧?如果可能的话,我也不反对在Ant中这样做。抱歉,我知道我有点含糊(或不清楚),我只是今天的Google fu不太好。

事实上,将文件名之类的参数放入代码中是不好的做法,即使它是在编译时完成的,正如您所建议的那样


更好的解决方案是实际参数化应用程序。它是一个简单的控制台应用程序吗?然后,您可以添加文件名作为控制台参数,并在main方法中读取它。

一个选项是将字符串放入
常量
类中,这样就不会到处都有重复的字符串

public class Constant {
    public static final String FILE_PATH= "";
}


另一种选择是将该字符串放入属性文件,并在应用程序启动时加载它。因为您有两个构建(调试和发布),所以您可能有两个构建/运行脚本。您还应该有两个属性文件:
testconfig.properies
config.properties
,它们包含不同的文件路径。每个应用程序都应该包含在可执行jar中(或以何种方式部署应用程序),具体取决于它是调试版还是发布版。

就我个人而言,我会重新定义问题,并在命令行上传递文件名:

java -Dfile=PrixingMaster.omas -jar foo.jar
或者使用类似于:


或者选项文件,或者标志,或者基于当前机器或用户的东西等等。

您基本上遇到了这个问题,因为您正在硬编码字符串。理想情况下,应该将这些字符串外部化到一个
.properties
文件中,这样您就可以指向另一个文件,而无需重新编译程序

这并不难做到。Eclipse附带了一个内置的
externalisestrings
特性,可以为您处理所有Java代码。其他任何事情都只是围绕这个问题进行黑客攻击

Eclipse的
Source
菜单:


您可以有一个配置类,其中可以有一个名为networkDrive的静态变量

public class Config{
     //public static String networkDrive = "PricingMasterBetaTest.omas"; //DEBUG
     public static String networkDrive = "PricingMaster.omas"; //RELEASE
}
当您想使用“PricingMasterBetaTest.omas”时,只需注释掉调试行和注释发布行

File masterFile = new File("g:/DataTeam", Config.networkDrive);

将文件名放在属性文件中,并为其使用资源包

您将测试类存储在哪里?在Maven项目中是否有类似于
src/main/java
src/test/java
的并行层次结构,或者像在Ant和Eclipse中一样有
src
test
?如果这样做,则在相应位置使用同名的属性文件,并确保测试层次结构位于源文件夹列表或Ant类路径中的src层次结构之前。我认为首先出现的文件在类路径中获胜。您必须使用Ant手动完成任务,必须在Eclipse中使用选项,或者使用Maven自动完成任务

蚂蚁 那么,你的层次结构是什么

  • src
    • com
      • 杰卡尔
        • 奥马斯
          • 价格、财产
  • 试验
    • com
      • 杰卡尔
        • 奥马斯
          • 价格、财产
并定义类路径:

<path id="lib.classpath">
    ...
</path>

<!--  Additional libraries for testing. -->
<path id="testlib.classpath">
    ...
</path>

<path id="compile.classpath">
    ...
    <pathelement location="src"/>
    <path refid="lib.classpath"/>
</path>

<path id="test.classpath">
    <path refid="testlib.classpath"/>
    <pathelement location="test"/>
    <path refid="compile.classpath"/>
</path>

...
...
...
使用测试类路径进行测试,以使测试/./pricing.properties获胜

专家 只用

  • src
    • 主要
      • 爪哇
        • com
          • 杰卡尔
            • 奥马斯
              • 价格、财产
    • 试验
      • 爪哇
        • com
          • 杰卡尔
            • 奥马斯
              • 价格、财产
你完了

日食 这是最难的。我不知道如何从主构建中排除测试库和文件夹。这不是一个完整的答案


您可以将测试放在一个新项目中,该项目取决于您的主项目。这将防止您意外地使用junit.jar部署工具。

您可以使用if语句。这不是一个选项吗?注入由配置驱动的数据的常用方法是使用属性文件,该文件根据您的配置具有不同的值。本质上,您的jar部署将包含一个属性文件,其中包含您要用于测试的文件和路径。@Hunter我真的希望将其作为编译时决策,而不是运行时决策。有编译时ifs吗?我还是个新手…@JayCarr不,但为什么需要编译时决定呢?运行时一个if语句真的会花费你很多吗?或者在列表中创建一个带有
公共静态最终字符串常量的final类,在这里你可以在一个地方更改文件,嗯,我承认这两个都是好主意。我一直在考虑做类似的事情,但我更愿意告诉编译器根据情况选择哪一个。。。我会记住这一点,以防做不到。@JayCarr我认为从每一个答案中你应该选择什么方向是非常清楚的。我一点也不理解这种不情愿。@Dave呃,这不是个人的事。我只是想换一种方式,
File masterFile = new File("g:/DataTeam", Config.networkDrive);
<path id="lib.classpath">
    ...
</path>

<!--  Additional libraries for testing. -->
<path id="testlib.classpath">
    ...
</path>

<path id="compile.classpath">
    ...
    <pathelement location="src"/>
    <path refid="lib.classpath"/>
</path>

<path id="test.classpath">
    <path refid="testlib.classpath"/>
    <pathelement location="test"/>
    <path refid="compile.classpath"/>
</path>