代码之家  ›  专栏  ›  技术社区  ›  Emmanuel Guiton

使用maven构建两次具有不同依赖项的相同webapp的最佳方法

  •  2
  • Emmanuel Guiton  · 技术社区  · 7 年前

    我有一个带有webapp的maven项目,我需要两个版本,每个版本都有自己的依赖项集。其目的是支持存储客户端的两个不同(且相互冲突)版本。webapp代码、配置文件和任何东西在这两种情况下都是相同的,但某些库除外。在运行时加载正确的客户端:我只需要将正确的jar(及其依赖项)放到webapp的lib文件夹中。

    我不想将webapp部署在maven存储库上,因为它不是一个库,而且它只会生成一个大的归档文件(主要是因为嵌入的依赖关系),而不需要任何空间。因此,为了构建最终的战争,我不能添加对webapp项目的依赖。

    我不想在两个不同的模块中复制常见的webapp类文件和配置文件。由于每次更新一个文件时,两个模块之间都需要进行必要的同步,因此这将使未来的进化更加困难。

    注意,最好的解决方案应该允许同时构建两个战争。

    3 回复  |  直到 7 年前
        1
  •  3
  •   J Fabian Meier    7 年前

    使用Maven配置文件。

    http://maven.apache.org/guides/introduction/introduction-to-profiles.html

    您可以将某些依赖项放入某些配置文件中,并通过命令行使用 -P

        2
  •  3
  •   Aaron    7 年前

    <project [...]>
        [...]
        <profiles>
    
          <profile>
            <id>storage1</id>
            <dependencies>
              <dependency>
                 <groupId>my.group.storage</groupId>
                 <artifactId>thisOne</artifactId>
                 <version>13</version>
              </dependency>
            </dependencies>
          </profile>
    
          <profile>
            <id>storage2</id>
            <dependencies>
              <dependency>
                 <groupId>my.group.storage</groupId>
                 <artifactId>thisOtherOne</artifactId>
                 <version>37</version>
              </dependency>
            </dependencies>
          </profile>
    
        </profiles>
        [...]
    </project>
    

    给其中一个打电话 mvn -P storage1 mvn -P storage2

    Here 这是他们的介绍文章。

        3
  •  2
  •   Emmanuel Guiton    7 年前

    最后,我没有使用配置文件。同时构建两个webapp版本时出现问题。

    https://maven.apache.org/plugins/maven-war-plugin/overlays.html .

    首先,我创建了webapp的瘦战争版本。瘦战不包括库或META-INF文件。只有配置文件之类的资源。webapp类打包在一个jar中(使用 attachedClasses 的配置选项 maven-war-plugin maven war插件

                <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <configuration>
                    <outputFileNameMapping>@{groupId}@.@{artifactId}@-@{version}@@{dashClassifier?}@.@{extension}@</outputFileNameMapping>
                    <attachClasses>true</attachClasses>
                    <archive>
                        <addMavenDescriptor>false</addMavenDescriptor>
                    </archive>
                    <packagingExcludes>WEB-INF/classes/**/*,WEB-INF/lib/*</packagingExcludes>
                </configuration>
            </plugin>
    

    然后,我创建了另外两个模块,每个模块对应于webapp的不同风格。在依存关系中,我设置: -webapp作为war类型的依赖项 -存储客户端库

    <dependencies>
        <dependency>
            <groupId>com.storage</groupId>
            <artifactId>client</artifactId>
            <version>${project.version}</version>
        </dependency>
        <dependency>
            <groupId>com.group.id</groupId>
            <artifactId>webapp</artifactId>
            <version>${project.version}</version>
            <classifier>classes</classifier>
            <type>jar</type>
        </dependency>
        <dependency>
            <groupId>com.group.id</groupId>
            <artifactId>webapp</artifactId>
            <version>${project.version}</version>
            <type>war</type>
        </dependency>
    </dependencies>
    
    <build>
        <plugins>                   
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
            </plugin>
    
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-install-plugin</artifactId>
                <configuration>
                    <skip>true</skip>
                </configuration>
            </plugin>
    
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-deploy-plugin</artifactId>
                <configuration>
                    <skip>true</skip>
                </configuration>
            </plugin>
        </plugins>
    </build>