从不同操作系统的2个配置文件生成2个罐子

时间:2016-07-14 18:25:47

标签: maven jar swt

我正在尝试用2种方法创建2个罐子(Profiles和executiosn) 我的目标是创建macJar.jar和windowsJar.jar,它们应该具有os特定的swt依赖性。

这可能来自appr以下吗?

方法1:使用个人资料 命令: mvn clean install -Pwindows,mac mvn clean install -Pmac,windows mvn clean install -P windows,mac(space after after -P) Obeservations:在任一命令中,只有一个jar创建了' windowsJar.jar'

    <profiles>
      <profile>
            <id>windows</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <jarName>windowsJar</jarName>
                <swt.groupId>org.eclipse.swt.org.eclipse.swt.win32.win32.x86.4.3.swt</swt.groupId>
                <swt.artifactId>org.eclipse.swt.win32.win32.x86</swt.artifactId>
                <swt.version>4.5</swt.version>
            </properties>

            <build>
                <plugins>
                    <plugin>
                     <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-assembly-plugin</artifactId>
                        <version>3.0.0-SNAPSHOT</version>

                        <configuration>
                            <descriptorRefs>
                                <descriptorRef>jar-with-dependencies</descriptorRef>
                            </descriptorRefs>
                            <archive>
                                <manifest>
                                    <mainClass>org.test.test1.Mainclass</mainClass>
                                </manifest>
                            </archive>
                            <finalName>${jarName}</finalName>
                            <appendAssemblyId>false</appendAssemblyId>

                        </configuration>
                        <executions>
                            <execution>
                                <id>make-assembly</id>
                                <phase>package</phase>
                                <goals>
                                    <goal>single</goal>
                                </goals>

                            </execution>
                        </executions>
                    </plugin>
                    </profile>

    <profile>
            <id>mac</id>
            <activation>
                <activeByDefault>false</activeByDefault>
            </activation>
            <properties>
                <jarName>macJAR</jarName>
                <swt.groupId>org.eclipse.swt.org.eclipse.swt.cocoa.macosx.x86_64.4.3.swt</swt.groupId>
                <swt.artifactId>org.eclipse.swt.cocoa.macosx.x86_64</swt.artifactId>
                <swt.version>4.5</swt.version>
            </properties>

            <build>
                <plugins>
                    <plugin>
                      <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-assembly-plugin</artifactId>
                        <version>3.0.0-SNAPSHOT</version>

                    <configuration>
                            <descriptorRefs>
                                <descriptorRef>jar-with-dependencies</descriptorRef>
                            </descriptorRefs>
                            <archive>
                                <manifest>
<mainClass>org.test.test1.Mainclass</mainClass>

                                </manifest>
                            </archive>
                            <finalName>${jarName}</finalName>
                            <appendAssemblyId>false</appendAssemblyId>
                        </configuration>
                        <executions>
                            <execution>
                                <id>make-assembly</id>
                                <phase>package</phase>
                                <goals>
                                    <goal>single</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </build>
        </profile>
</profiles>

方法2:使用执行 命令: mvn clean install Obeservations:在任一命令中,只有一个jar创建了&#39; windowsJar.jar&#39;

              <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-assembly-plugin</artifactId>
                    <version>3.0.0-SNAPSHOT</version>

                    <configuration>
                        <descriptorRefs>
                            <descriptorRef>jar-with-dependencies</descriptorRef>
                        </descriptorRefs>
                        <archive>
                            <manifest>
                                 <mainClass>org.test.test1.Mainclass</mainClass>

                            </manifest>
                        </archive>
                        <appendAssemblyId>false</appendAssemblyId>
                    </configuration>
                    <executions>
                        <execution>
                            <id>mac-make-assembly</id>
                            <phase>package</phase>
                            <goals>
                                <goal>single</goal>
                            </goals>
<configuration>
             <classifier>mac</classifier>
           </configuration>

                        </execution>

                        <execution>
                            <id>windows-make-assembly</id>
                            <phase>package</phase>
                            <goals>
                                <goal>single</goal>
                            </goals>
                            <configuration>
             <classifier>windows</classifier>
           </configuration>
                        </execution>
                    </executions>
                </plugin>

1 个答案:

答案 0 :(得分:1)

在maven构建中,每个属性只能有一个值。第二次定义属性值最终会覆盖第一个值,而不是将项目构建拆分为两个分支。因此,当您激活两个配置文件并且它们都修改属性值时,其中一个会覆盖另一个。

在您的情况下,您需要区分两个概念:构建环境与运行环境。

构建环境

您的构建需要在某些环境中执行。对于运行测试等具有适当的依赖性非常重要。显然,如果在Windows上提供MacOS lib,测试将无法运行。

运行环境

您似乎需要为每个运行环境创建单独的分发。虽然测试只能在单个构建环境中运行,但您可以捆绑不同的jar以从单个构建中创建不同的分发。

特定于环境的测试

你测试有多重要?某些功能是否可能是特定于环境的,并且可能会在不同的操作系统上中断?如果这是真的,您应该只有两个不同的构建,并且应该在其环境中编译,测试和打包每个分发以确保测试正确运行。如果是这种情况,请保持您的构建不变,并确保您的CI服务器每个环境至少有一个构建代理。将CI配置为始终在每个环境中运行此构建一次,然后从两个构建中选择最终构建结果。这显然是额外的努力,但如果你的测试很重要,那么从长远来看它会得到回报。

没有特定于环境的测试

替代解决方案是拥有一个构建环境,运行您可能只针对该环境的任何测试,但生成多个分发包。我建议将项目拆分为三个项目:

  1. “核心”与共同部分
  2. “windows”分发项目与特定于Windows的部分
  3. 具有特定于macos的部分的“mac”分发项目
  4. 创建这些环境项目,即使唯一的区别是那些SWT库。你 CAN 将所有这些作为一个项目,但它可能会比它的价值更痛苦。

    随后:

    1. 在核心pom.xml中:确保核心项目生成适当的jar。它需要一些依赖来编译,所以你为每个构建环境创建一个配置文件(你可能只有一个构建环境,在这种情况下没有必要的配置文件),并在每个配置文件中定义适当的依赖关系{{ 1}}以确保它仅用于编译/测试。

    2. 在windows / macos <scope>provided</scope>中:在每个添加依赖于核心和环境特定的库(在本例中为SWT)和默认范围。您现有的程序集插件配置将移至这两个项目。

    3. 运行构建时,您只需指定构建环境的配置文件,但每次都会获得两个分发包。