使用Maven,如何使用一个不同的.java文件构建两个版本的Java项目?

时间:2017-02-16 22:22:56

标签: java maven

我想构建一个应用程序的两个版本,唯一的区别是我想交换一个特定.java文件的不同版本。我已经有了一个用于构建源代码的Maven构建版本,加上一个Ant构建版本,然后将其打包为带有嵌入式JRE的zip

所以我可以修改我的Ant构建来为这个新构建创建另一个zip文件,但是使用单个修改的源文件处理源代码重建的最佳方法是什么?

已更新进度

我现在已经使用main()方法对起始类进行了子类化,因此不再需要交换源文件而只需要为清单中的mainClass传递差值,我们现在只有一个源树可以构建。

所以在pom.xml我有:

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>2.3</version>
        <configuration>
            <descriptorRefs>
                <descriptorRef>jar-with-dependencies</descriptorRef>
            </descriptorRefs>
            <descriptors>
                <descriptor>assembly.xml</descriptor>
            </descriptors>
            <archive>
                <manifest>
                                  <mainClass>com.companyname.StartClass</mainClass>
                    <packageName>com.companyname</packageName>
                    <addClasspath>true</addClasspath>
                </manifest>
            </archive>
        </configuration>
        <executions>
            <execution>
                <id>make-assembly</id>
                <phase>package</phase>
                <goals>
                    <goal>single</goal>
                </goals>
            </execution>
        </executions>
    </plugin>

那么我可以拥有多个这些组装插件,这样我就可以在清单中构建两个不同的组件吗?

1 个答案:

答案 0 :(得分:0)

基本上这是针对Maven的一些核心概念:

  • 一个项目有一个<build>/<sourceDirectory>导致一个工件。
  • 具有相同名称的工件(默认情况下从<finalName><artifactId>派生的<version>)应具有相同的内容。

有一些解决方案:

  • 来自属性文件的property,该文件在if中进行评估,以实现不同的运行时行为。你不喜欢那样。
  • 通过命令行定义的property,在if
  • 中进行评估
  • if中评估的text from a resource file。你不喜欢那样。
  • if评估的command line argument
  • A Java assertion,但从那里引用:“不要使用断言来执行您的应用程序正确操作所需的任何工作。”。

一种Maven的方式是:

  <profiles>

    <profile>
      <id>B</id>
      <activation>
        ...
      </activation>
      <dependencies>
        <dependency>
          <groupId>com.example</groupId>
          <artifactId>B</artifactId>
          <version>...</version>              
        </dependency>
      </dependencies>
      <build>
        <finalName>AwithB</finalName>
      </build>
    </profile>

    <profile>
      <id>C</id>
      <activation>
        ...
      </activation>
      <dependencies>
        <dependency>
          <groupId>com.example</groupId>
          <artifactId>C</artifactId>
          <version>...</version>              
        </dependency>
      </dependencies>
      <build>
        <finalName>AwithC</finalName>
      </build>
    </profile>

  </profiles>

记住开头的第二个概念:相同名称,相同内容(和行为)。您可以使用配置文件中的<finalName>声明来相应地调整A的名称。