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

时间:2013-06-25 20:58:34

标签: java eclipse ant

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

所以:

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

变为:

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

这实际上发生在几个文件的几个地方,所以,你可以想象,有时我会忘记,我的用户最终会很困惑。所以我想知道是否有办法使它能够确定使用哪个字符串取决于我正在编译它的内容?

我曾尝试过询问Google,但我没有足够的知识来正确地表达问题。在我看来,伪代码看起来像这样:

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

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

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

6 个答案:

答案 0 :(得分:3)

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

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

或使用类似option parsing library的内容:

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

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

答案 1 :(得分:3)

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

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

Eclipse的Source菜单:

Externalise Strings

答案 2 :(得分:0)

实际上,将参数(如文件名)放入代码中是不好的做法,即使它是在编译时完成的,如你所说。

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

答案 3 :(得分:0)

一个选项是将字符串放在Constants类中,这样就不会在整个地方重复使用字符串。

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

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

答案 4 :(得分: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);

答案 5 :(得分:0)

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

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

ANT

所以,让您的层次结构

  • SRC
    • COM
      • jaycarr
        • OMAS
          • pricing.properties
  • 测试
    • COM
      • jaycarr
        • OMAS
          • pricing.properties

定义类路径:

<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获胜。

的Maven

只需使用

  • SRC
      • 的java
        • COM
          • jaycarr
            • OMAS
              • pricing.properties
    • 测试
      • 的java
        • COM
          • jaycarr
            • OMAS
              • pricing.properties
你已经完成了。

的Eclipse

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

您可以将测试放在一个取决于您的主项目的新项目中。这将使您无法偶然使用junit.jar部署工具。