从打包的war文件

时间:2015-07-01 12:37:52

标签: java eclipse maven jar

我已经提到了pom.xml中所有必需JAR的依赖关系。现在,由于依赖关系在 POM 中定义,JAR将自动打包到lib文件夹中。

我想排除项目源中存在的lib中的所有JAR。 在构建WAR

时,应将依赖JAR包装在lib中

我正在使用打包排除标记,以排除本地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标签中指定名称来排除几个罐子。但我有太多的罐子要在exludes标签下明确写出

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

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

3 个答案:

答案 0 :(得分:2)

我终于(经过少量编辑)了解你的问题。不幸的是,我觉得没有你称之为黑客的东西是非常困难的。这很难,因为maven并不真正支持手动添加的罐子。这被认为是不好的做法,但我们尝试做一些事情。您可以这样做:

  1. 将maven依赖项复制到某个临时目录
  2. 将子目录插入WEB-INF/lib
  3. *.jar中删除每个WEB-INF/lib,但不从子目录中删除。
  4. 以下是更详细的步骤:

    首先将copy-dependencies添加到某个临时目录(在我的例子中是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连接器来解决此问题(此插件是默认生命周期没有涵盖。这就是你需要连接器的原因。

    之后我们需要告诉maven将此目录放在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,并从*.jar中排除WEB-INF/lib WEB-INF/lib/maven-deps,但从WEB-INF/lib/maven-deps排除 NOT }

    这样你只会在war中获得maven托管依赖项,并且根据规范应该可以从WEB-INF/lib类加载器中看到,因为类加载器应该从ForEach加载所有jar并且它是子目录。

    我知道这有点像黑客,但目前我无法想到更好的解决方案。

答案 1 :(得分:0)

我为此做了一个工作。我将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>

答案 2 :(得分:0)

只需为依赖项设置<scope>provided</scope>,它就不会打包成war。见more about maven scopes

如果您需要从WAR文件中排除某些文件,请使用packagingExcludes。文件不会包含在最终的战争中,但仍然存在于webappDirectory(构建webapp的目录)中。

Maven WAR Plugin reference中所述:

  

包含和排除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>