4

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

所以:

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

变成:

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

这实际上发生在几个文件中的几个地方,因此,正如您可能想象的那样,有时我会忘记并且我的用户最终会很困惑。所以我想知道是否有办法制作它,以便我可以根据我正在编译它的目的来确定使用哪个字符串?

我试过问谷歌,但我缺乏正确表达问题的知识。在我看来,伪代码看起来像这样:

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

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

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

4

6 回答 6

3

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

这并不难做到。Eclipse带有一个内置Externalise Strings功能,可以为您处理所有 Java 代码。其他任何事情都只是解决问题。

Eclipse 的Source菜单:

外部化字符串

于 2013-06-25T21:07:26.667 回答
3

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

java -Dfile=PrixingMaster.omas -jar foo.jar

或者使用类似选项解析库的东西:

@Option(name='file')
private String filename;

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

于 2013-06-25T21:05:28.797 回答
0

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

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

蚂蚁

所以,让你的层次结构

  • 源代码
    • 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>

使用测试类路径进行测试,因此 test/../pricing.properties 获胜。

马文

只需使用

  • 源代码
    • 主要的
      • 爪哇
        • com
          • 杰卡尔
            • 奥马斯
              • 定价属性
    • 测试
      • 爪哇
        • com
          • 杰卡尔
            • 奥马斯
              • 定价属性
你完成了。

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

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

于 2013-06-25T21:24:06.597 回答
0

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

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

于 2013-06-25T21:05:27.853 回答
0

一种选择是将字符串放在Constants类中,这样您就不会到处都有重复的字符串。

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

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

于 2013-06-25T21:05:28.023 回答
0

您可以拥有一个 Config 类,并且可以在其中拥有一个名为 networkDrive 的静态变量。

public class Config{
     //public static String networkDrive = "PricingMasterBetaTest.omas"; //DEBUG
     public static String networkDrive = "PricingMaster.omas"; //RELEASE
}

当您想使用“PricingMasterBetaTest.omas”时,只需注释掉 DEBUG 行并注释 RELEASE 行。

File masterFile = new File("g:/DataTeam", Config.networkDrive);
于 2013-06-25T21:14:40.203 回答