【问题标题】:how to include static files in jar如何在jar中包含静态文件
【发布时间】:2018-07-31 15:31:20
【问题描述】:

我有一个 ant 构建,它只生成一个充满 html 页面的 jar。我想对 Maven 做同样的事情。我目前正在将文件复制到一个新文件夹中,但这些文件没有被添加到最终的 jar 中。当我运行命令时
jar tf mavenjar.jar
我没有看到我的终端中列出的文件。它看起来像这样: click here
当我在蚂蚁生产的 jar 上运行相同的命令时,我看到以下内容: click here 这是我的pom

<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>
    <groupId>try1</groupId>
    <artifactId>try1</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
            </plugin>
        </plugins>
        <finalName>mavenjar</finalName>
        <resources>
            <resource>
                <directory>${basedir}/moveTheseFiles</directory>
                <targetPath>${basedir}/newFileLocation</targetPath>
                <filtering>false</filtering>
            </resource>
        </resources>
    </build>
</project>


关于将移动的文件包含到 jar 中可能缺少什么的任何想法?

【问题讨论】:

    标签: java maven ant pom.xml


    【解决方案1】:

    有两种方法可以实现这一点。遵循约定优于配置 - 或配置它。

    约定优于配置

    将静态文件复制到 jar 中的最简单方法是使用默认文件夹 src/main/resources。您在此处添加的所有文件都将添加到您的 jar 文件中。您的 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>
        <groupId>try1</groupId>
        <artifactId>try1</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <build>
            <finalName>mavenjar</finalName>
        </build>
    </project>
    

    非默认文件夹

    当您确实需要将文件放在另一个文件夹中时,您的配置几乎没有问题。只是缺少includes 部分。您必须告诉 maven 包含指定文件夹中的所有文件。

    <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>
        <groupId>try1</groupId>
        <artifactId>try1</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <build>
            <finalName>mavenjar</finalName>
            <resources>
                <resource>
                    <directory>moveTheseFiles</directory>
                    <includes>
                        <include>**/*</include>
                    </includes>
                    <filtering>false</filtering>
                </resource>
            </resources>
        </build>
    </project>
    

    注意: 好像您想创建一个 Web 应用程序。也许您想创建一个war 文件。为此,您可以简单地设置

    <packaging>war</packaging>
    

    在你的 pom.xml 中。然后所有网络资源(HTML 页面、CSS、...)都应该位于src/main/webapp 下,并将被复制到战争的根文件夹中。请注意,src/main/resources 中的文件将被复制到WEB-INF/classes 在由此产生的战争中。

    【讨论】:

      【解决方案2】:

      我实际上是按照这个解决方案让它工作的:Create zip in maven with additional files next to the jar

      我在这个位置 src/main/assembly 中创建了一个 bin.xml 文件。 bin.xml 看起来像这样

      <assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
        <id>bin</id>
        <baseDirectory>/</baseDirectory>
        <formats>
          <format>jar</format>
        </formats>
         <fileSets>
          <fileSet>
            <directory>${basedir}/dist/newLocation</directory>
            <outputDirectory>/</outputDirectory> 
          </fileSet>
        </fileSets>
      </assembly>
      

      我的 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>
          <groupId>try1</groupId>
          <artifactId>try1</artifactId>
          <version>0.0.1-SNAPSHOT</version>
      
          <build>
              <finalName>mavenjar</finalName>
              <resources>
                  <resource>
                      <directory>${basedir}/WWW</directory>
                      <targetPath>${basedir}/dist/newLocation</targetPath>
                      <filtering>false</filtering>
                  </resource>
              </resources>
              <plugins>
                  <plugin>
                      <artifactId>maven-assembly-plugin</artifactId>
                      <version>2.6</version>
                      <configuration>
                          <descriptors>
                              <descriptor>src/main/assembly/bin.xml</descriptor>
                          </descriptors>
                          <appendAssemblyId>false</appendAssemblyId>
                      </configuration>
                      <executions>
                          <execution>
                              <id>make-assembly</id> <!-- this is used for inheritance merges -->
                              <phase>package</phase> <!-- append to the packaging phase. -->
                              <goals>
                                  <goal>single</goal>
                              </goals>
                          </execution>
                      </executions>
                  </plugin>
              </plugins>
          </build>
      </project>
      

      在我运行的终端中

      mvn clean package
      cd target
      jar tf mavenjar.jar
      

      输出看起来像这样click here

      【讨论】:

      • 如果您使用此解决方案解决了您的问题,您可以通过单击绿色复选标记接受它。这会告诉其他用户此解决方案对您有效,并且更容易看出您不需要任何额外的帮助来解决此问题。
      猜你喜欢
      • 1970-01-01
      • 2017-02-16
      • 1970-01-01
      • 1970-01-01
      • 2018-05-15
      • 1970-01-01
      • 2023-03-29
      • 2022-07-12
      • 1970-01-01
      相关资源
      最近更新 更多