簡體   English   中英

從打包的war文件中排除本地WEB-INF / lib jar

[英]Exclude local WEB-INF/lib jars from packaged war file

我已經在pom.xml中提到了所有必需JAR的依賴關系。 現在,由於依賴項是在POM中定義的,因此JAR文件將自動打包在lib文件夾中。

我想排除項目源中存在的lib中的所有JAR。 在構建WAR時,應將Dependency JAR打包在lib中

我正在使用包裝excludes標簽 ,以排除本地jar。 但是它不包括打包的war文件中的所有jar。 我只想包含Maven依賴項。

                    <plugin>
                        <artifactId>maven-war-plugin</artifactId>
                        <version>2.4</version>
                        <configuration>
                            <warSourceDirectory>WebContent</warSourceDirectory>
                            <warName>${war.name}</warName>
                            <webResources>
                                <resource>
                                    <directory>config</directory>
                                    <targetPath>WEB-INF/classes</targetPath>
                                    <directory>${maven.lib.dir}</directory>
                                    <targetPath>WEB-INF/lib</targetPath>                                
                                </resource>                                                                             
                            </webResources>
                            <archive>
                                <manifestEntries>
                                    <Built-Date>${maven.build.timestamp}</Built-Date>
                                </manifestEntries>
                            </archive>
                            <packagingExcludes>META-INF/*.xml</packagingExcludes>                           
                            <packagingExcludes>WEB-INF/*lib/</packagingExcludes>
                        </configuration>
                    </plugin>       

我可以通過在excludes標簽中指定名稱來排除幾個jar。 但是我有太多罐子無法在excludes標簽下顯式編寫

<packagingExcludes>
        WEB-INF/lib/commons-logging-*.jar,
        %regex[WEB-INF/lib/log4j-(?!over-slf4j).*.jar]
      </packagingExcludes>

我需要一些配置,在其中我可以排除整個文件夾

我終於(經過幾次編輯)終於明白了您的問題。 不幸的是,我認為如果沒有所謂的hack很難做到。 這很困難,因為maven並不真正支持手動添加的jar。 這被認為是不好的做法,但我們會嘗試對此做一些事情。 您可以執行以下操作:

  1. 將Maven依賴項復制到一些臨時目錄
  2. 將子目錄插入WEB-INF/lib
  3. WEB-INF/lib刪除每個*.jar ,但不要從子目錄中刪除。

以下是更詳細的步驟:

首先將復制依賴項添加到一些臨時目錄中(在我的情況下是maven-deps)

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <version>2.10</version>
    <executions>
        <execution>
            <id>copy-dependencies</id>
            <goals>
                <goal>copy-dependencies</goal>
            </goals>
            <configuration>
                <outputDirectory>${project.build.directory}/maven-deps</outputDirectory>
                <overWriteReleases>false</overWriteReleases>
                <overWriteSnapshots>false</overWriteSnapshots>
                <overWriteIfNewer>true</overWriteIfNewer>
            </configuration>
        </execution>
    </executions>
</plugin>

請記住,在Eclipse IDE中,打開<execution>會出現錯誤,但是從工具提示菜單中,您可以通過從市場上安裝m2e連接器來解決此問題(默認生命周期未涵蓋此插件。因此,您需要連接器)。

之后,我們需要告訴行家到這個目錄下投入war下的WEB-INF/lib 請執行下列操作:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.5</version>
    <configuration>
        <packagingExcludes>WEB-INF/lib/*.jar</packagingExcludes>

        <webResources>
            <resource>
                <directory>target/maven-deps</directory>
                <includes>
                    <include>*.jar</include>
                </includes>
                <targetPath>WEB-INF/lib/maven-deps</targetPath>
            </resource>
        </webResources>
    </configuration>
</plugin>

這會將目錄maven-deps作為子目錄插入WEB-INF/lib並從WEB-INF/lib排除每個*.jar ,但WEB-INF/lib/maven-deps排除

這樣,您將只在WEB-INF/lib/maven-deps獲得maven管理的依賴項,並且根據規范,這應該在war類加載器中可見,因為類加載器應從WEB-INF/lib及其子目錄加載所有jar。 。

我知道這是一種破解,但是目前我無法想到更好的解決方案。

我為此進行了工作。 我將lib文件夾重命名為ant-libs,然后將其從包裝中排除。 創建好戰爭之后,我將ant-libs文件夾重命名為lib。

Maven coderplus插件:

              <plugin>
                <groupId>com.coderplus.maven.plugins</groupId>
                <artifactId>copy-rename-maven-plugin</artifactId>
                <version>1.0.1</version>
                <executions>
                  <execution>
                    <id>rename-file</id>
                    <phase>compile</phase>
                    <goals>
                      <goal>rename</goal>
                    </goals>
                    <configuration>
                      <sourceFile>${basedir}/WebContent/WEB-INF/lib</sourceFile>
                      <destinationFile>${basedir}/WebContent/WEB-INF/ant-libs</destinationFile>
                    </configuration>
                  </execution>
                  <execution>
                    <id>rename-file-back</id>
                    <phase>package</phase>
                    <goals>
                      <goal>rename</goal>
                    </goals>
                    <configuration>
                      <sourceFile>${basedir}/WebContent/WEB-INF/ant-libs</sourceFile>
                      <destinationFile>${basedir}/WebContent/WEB-INF/lib</destinationFile>
                    </configuration>
                  </execution>
                </executions>
              </plugin>

Maven War插件:

                 <plugin>
                    <artifactId>maven-war-plugin</artifactId>
                    <version>2.4</version>
                    <configuration>
                        <warSourceDirectory>WebContent</warSourceDirectory>
                        <warName>${war.name}</warName>
                        <webResources>
                            <resource>
                                <directory>config</directory>
                                <targetPath>WEB-INF/classes</targetPath>                                    
                            </resource>
                            <resource>
                            <directory>${maven.lib.dir}</directory>
                            <targetPath>WEB-INF/lib</targetPath>
                            </resource> 
                        </webResources>
                        <archive>
                            <manifestEntries>
                                <Built-Date>${maven.build.timestamp}</Built-Date>
                            </manifestEntries>
                        </archive>
                        <packagingExcludes>WEB-INF/*ant-libs/</packagingExcludes>
                    </configuration>
                </plugin>

只需將<scope>provided</scope>為依賴項,它將不會打包到war中。 進一步了解Maven范圍

如果需要從WAR文件中排除某些文件,請使用packagingExcludes 文件不會包含在最終戰爭中,但仍會存在於webappDirectory (構建webapp的目錄)中。

Maven WAR插件參考中所述

包含和排除WAR中的文件

使用和配置參數, 可以從WAR文件中包含或排除某些文件 它們每個都以逗號分隔的Ant文件集模式列表。 您可以使用通配符,例如**表示多個目錄,並使用*表示文件或目錄名稱的可選部分。

這是一個示例,其中我們從WEB-INF / lib中排除了所有JAR文件:

 <project> ... <build> <plugins> <plugin> <artifactId>maven-war-plugin</artifactId> <version>2.6</version> <configuration> <packagingExcludes>WEB-INF/lib/*.jar</packagingExcludes> </configuration> </plugin> </plugins> </build> ... </project> 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM