在一次调用中构建具有4种配置的java解决方案

时间:2013-12-09 11:37:41

标签: java eclipse maven deployment swt

我有5个项目的解决方案:

  • 00-PROJECT - 整个解决方案的父项目。其他项目是这个项目的子模型。
  • 01-INTERFACE - 用于客户端和服务器之间通信的API描述库
  • 02-SERVER - 提供API的服务器应用程序
  • 03-CLIENT - 与服务器应用程序通信的客户端模块
  • 04-DESKTOP - 使用SWT GUI库构建的桌面应用程序。使用03-CLIENT中的客户端模块与服务器通信。

在开发整个解决方案时,我需要在02-SERVER中嵌入04-DESKTOP。这是在Eclipse IDE中轻松运行和调试应用程序所必需的,因为它们和客户端以及服务器都在一起开发。

但是要将应用程序部署到客户端,我需要单独构建02-SERVER04-DESKTOP。我找到了准备部署的解决方案.zip - 它是maven-assembly-plugin。它将所有.jars,配置文件,jasper模板组合在一个.zip(或文件夹)中。它完美无缺。但是当我尝试为多个平台创建04-DESKTOP的部署包时出现了一个问题,至少这三个平台:Windows 32位,Windows 64位,Linux 64位(都在客户组织中使用)。

04-DESKTOP的解决方案之一是配置文件。 Maven提供强大的配置文件系统。但问题是您可以使用一个配置文件运行maven,并且无法为多个配置文件调用maven。第二个想法是我调用maven为每个配置文件构建包使用父pom 02-SERVER每次都重新编译,我不喜欢这个解决方案。

我的主要问题是如何使用单个命令准备5个软件包(一个服务器软件包和4个桌面软件包)?例如在父项目中调用mvn package

1 个答案:

答案 0 :(得分:0)

我找了一会儿答案。这里有关于stackoverflow.com和答案的类似问题,但我没有找到我的问题的答案。经过一番研究和尝试后,我找到了解决方案。

我刚在解决方案中为我需要的每个平台添加了4个项目。所以我的解决方案现在有7个项目:

  • 00项目
  • 01-INTERFACE
  • 02-SERVER
  • 03-CLIENT
  • 04-DESKTOP
  • 04-DESKTOP-LINUX 86
  • 04-DESKTOP-LINUX-64
  • 04-DESKTOP-WIN32 86
  • 04-DESKTOP-WIN32-64

这些附加项目中的文件夹中没有源代码。但是这些项目中有pom.xml。构建配置指向04-DESKTOP sources文件夹:

<build>
    <sourceDirectory>../04-DESKTOP/src</sourceDirectory>
</build>

因为所有这4个项目都是主项目中的模块,所以我不能给它们相同的artifactId。但是maven-jar-plugin默认情况下会创建名称等于artifactId的jar。因此,结果jar文件名在maven-jar-plugin中重新定义:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <configuration>
        <archive>
            <manifest>
                <addClasspath>true</addClasspath>
                <classpathPrefix></classpathPrefix>
                <mainClass>net.cloudstock.desktop.app</mainClass>
            </manifest>
        </archive>
        <finalName>net.cloudstock.desktop-${project.version}</finalName>
    </configuration>
</plugin>

其他一个项目的整个pom.xml是:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <!-- Information about parent project -->
        <artifactId>net.cloudstock.system</artifactId>
        <groupId>net.cloudstock</groupId>
        <version>1.0.1</version>
    </parent>
    <artifactId>net.cloudstock.desktop.win32.x86</artifactId>
    <name>Cloudstock Descktop frontend (Windows x86)</name>
    <packaging>jar</packaging>

    <properties>
        <!-- Operation system where this app must run -->
        <os>win32</os>
        <!-- Processor architecture -->
        <arch>x86</arch>
        <!-- Variable to point sources to 04-DESKTOP/src folder -->
        <desktop.root>../04-DESKTOP</desktop.root>
        <!-- I am new in maven, so I can't comment this line -->
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <build>
        <!-- Tell to the compiler where sources are -->
        <sourceDirectory>${desktop.root}/src</sourceDirectory>
        <resources>
            <resource>
                <directory>src</directory>
                <excludes>
                    <exclude>**/*.java</exclude>
                </excludes>
            </resource>
        </resources>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <classpathPrefix></classpathPrefix>
                            <mainClass>net.cloudstock.desktop.app</mainClass>
                        </manifest>
                    </archive>
                            <!-- Redefine result jar, because by default its name will be net.cloudstock.desktop.win32.x86-{VERSION}.jar -->

                    <finalName>net.cloudstock.desktop-${project.version}</finalName>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                        <configuration>
                            <descriptors>
                                <descriptor>${desktop.root}/assembly.xml</descriptor>
                            </descriptors>
                                    <!-- the name of the zip archive with program that I send to the customer --> 
                            <finalName>net.cloudstock.desktop-${os}-${arch}-${project.version}</finalName>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
    <dependencies>
    <!-- SWT for Win x86. It differs for different OSes and processors -->
        <dependency>
            <groupId>org.eclipse.swt</groupId>
            <artifactId>org.eclipse.swt.win32.win32.x86</artifactId>
            <version>4.3</version>
        </dependency>
    <!-- Other application deps. They are duplicated in all 04-DESKTOP* projects --> 
        <dependency>
            <groupId>net.sf.jasperreports</groupId>
            <artifactId>jasperreports</artifactId>
            <version>5.1.0</version>
        </dependency>
        <dependency>
            <groupId>net.cloudstock</groupId>
            <artifactId>net.cloudstock.client</artifactId>
            <version>1.0.1</version>
        </dependency>
        <dependency>
            <groupId>net.cloudstock</groupId>
            <artifactId>net.cloudstock.interface</artifactId>
            <version>1.0.1</version>
        </dependency>
        <dependency>
            <groupId>org.eclipse.jface</groupId>
            <artifactId>org.eclipse.jface</artifactId>
            <version>3.8.0.v20120521-2329</version>
        </dependency>
    </dependencies>
</project>

这个架构中的一件事是不够好${desktop.root}/assembly.xml 您无法告诉maven-assembly-plugin在程序集中包含工件jar,因为它包含带有artifactId名称的jar。所以我添加了一个fileSet来包含当前项目中生成的jar:

<fileSets>
    <fileSet>
        <directory>target</directory>
        <outputDirectory>lib/</outputDirectory>
        <includes>
            <include>net.cloudstock.desktop-${project.version}.jar</include>
        </includes>
    </fileSet>
    ...
</fileSets>

最后,我在04-DESCTOP/pom.xml中添加了依赖标记以包含02-SERVER,并且通过os条件激活了四个配置文件:

<profile>
    <id>win-x86-debug</id>
    <activation>
        <activeByDefault>false</activeByDefault>
        <os>
            <family>Windows</family>
            <arch>x86</arch>
        </os>
    </activation>
    <dependencies>
        <dependency>
            <groupId>org.eclipse.swt</groupId>
            <artifactId>org.eclipse.swt.win32.win32.x86</artifactId>
            <version>4.3</version>
        </dependency>
    </dependencies>
</profile>

现在我在Eclipse的04-DESCTOP项目中开发桌面应用程序。我可以运行并调试整个解决方案。

当我完成当前迭代并希望将应用程序发送给客户时,我使用父项目mvn package中的一个命令构建它:

[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO] ------------------------------------------------------------------------
[INFO] Cloudstock System ..................................... SUCCESS [2.202s]
[INFO] Helper Library by Nicolai Budico ...................... SUCCESS [4.563s]
[INFO] Cloudstock Interface .................................. SUCCESS [2.925s]
[INFO] Cloudstock Server ..................................... SUCCESS [3.835s]
[INFO] Cloudstock Client Backend ............................. SUCCESS [1.120s]
[INFO] Cloudstock Descktop frontend (Windows x86) ............ SUCCESS [9.019s]
[INFO] Cloudstock Descktop frontend (Windows x64) ............ SUCCESS [5.530s]
[INFO] Cloudstock Descktop frontend (Linux x86) .............. SUCCESS [5.158s]
[INFO] Cloudstock Descktop frontend (Linux x64) .............. SUCCESS [4.998s]
[INFO] ------------------------------------------------------------------------

在此解决方案中必须注意的最后一点是,如果在桌面应用程序配置中更改了某些内容,则需要编辑5个pom。

也许这个解决方案是错误的,也许它不是那么正确,但我对它非常满意。我真的希望这会对某人有所帮助。