簡體   English   中英

Maven:將資源復制到動態目錄

[英]Maven: Copy resources to dynamic directory

我是Maven新手,我的項目終於可以正確編譯並運行。

在每次運行我的項目在運行時(創建一個動態的位置寫報告username_timestamp ),並設置一個System.property稱為REPORTS_LOCATION這個位置。 執行后,我想使用Maven目標將一些靜態資源(樣式,圖像,js等)復制到此動態文件夾。

我不知道如何讓Maven知道此動態位置或如何訪問此System.property

我准備好讓我的項目將這些資源復制到目錄中,但是我認為如果有一種簡便的方法可以再嘗試一次。

我已經將資源復制到硬編碼位置。 這是POM的片段。 我正在使用Jbehave的Maven目標,它們確實按順序執行

<plugins>
  <plugin>
    <groupId>org.jbehave</groupId>
    <artifactId>jbehave-maven-plugin</artifactId>
    <version>${jbehave.core.version}</version>
    <executions>
      <execution>
        <id>embeddable-stories</id>
        <phase>integration-test</phase>
        <configuration>
          <includes>
            <include>**/Stories.java</include>
          </includes>
          <excludes />
          <metaFilters>
            <metaFilter>${meta.filter}</metaFilter>
          </metaFilters>
        </configuration>
        <goals>
          <goal>run-stories-as-embeddables</goal>
        </goals>
      </execution>
      <!-- Copy the resources AFTER the execution is done -->
      <execution>
        <id>unpack-view-resources</id>
        <phase>integration-test</phase>
        <configuration>
            <viewDirectory>${basedir}/src/main/java/project/reports/{NEED TO FEED DIRECTORY HERE}</viewDirectory>
        </configuration>
        <goals>
          <goal>unpack-view-resources</goal>
        </goals>
      </execution>
    </executions>
  </plugin>
</plugins>

聽起來好像您有一段Java代碼正在計算{username_timestamp},然后您希望該代碼能夠將計算出的{username_timestamp}返回給Maven,以便在其生命周期的后續步驟中使用。 我不確定這是否可能。 相反,如何反轉過程,以便Maven生成時間戳,然后從代碼中使用它呢? 您可以結合使用build-helper-maven-plugin,Maven資源過濾和Java代碼來加載屬性文件來實現。

的pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>junk</groupId>
    <artifactId>junk</artifactId>
    <packaging>jar</packaging>
    <version>0.0.1-SNAPSHOT</version>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <build>
        <plugins>
            <!--
            Use build-helper-maven-plugin to generate a timestamp during the
            initialize phase and store it as a property named "timestamp".
            -->
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>build-helper-maven-plugin</artifactId>
                <version>1.7</version>
                <executions>
                    <execution>
                        <id>timestamp-property</id>
                        <phase>initialize</phase>
                        <goals>
                            <goal>timestamp-property</goal>
                        </goals>
                        <configuration>
                            <locale>en_US</locale>
                            <name>timestamp</name>
                            <pattern>yyyyMMDDHHmmssSSS</pattern>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>

                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>Main</mainClass>
                        </manifest>
                    </archive>

                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>

                    <finalName>${pom.artifactId}</finalName>
                    <appendAssemblyId>false</appendAssemblyId>
                </configuration>

                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>

                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>

        <!--
        Turn on resource filtering so that references to ${timestamp} in a
        properties file get replaced with the value of the timestamp property.
        -->
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>
</project>

SRC /主/資源/ junk.properties

timestamp=${timestamp}

的src /主/爪哇/ Main.java

import java.util.Properties;

public final class Main {

    public static void main(String[] args) throws Exception {
        Properties props = new Properties();
        props.load(Main.class.getResourceAsStream("/junk.properties"));
        System.out.println(props.getProperty("timestamp"));
    }
}

十分感謝cnauroth,這就像是一種魅力。 這是我工作中更新的POM,以防他人

<resources>
  <resource>
    <directory>${basedir}/src/main/java/resources</directory>
    <excludes><exclude>**/locale/**</exclude></excludes>
    <filtering>true</filtering>
  </resource>
</resources>
<plugins>

<!-- Use build-helper-maven-plugin to generate a timestamp during the initialize 
    phase and store it as a property named "mavenTimestamp". -->
<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>build-helper-maven-plugin</artifactId>
    <version>1.7</version>
    <executions>
        <execution>
            <id>timestamp-property</id>
            <phase>initialize</phase>
            <goals>
                <goal>timestamp-property</goal>
            </goals>
            <configuration>
                <locale>en_US</locale>
                <name>mavenTimestamp</name>
                <pattern>yyyyMMDDHHmmssSSS</pattern>
            </configuration>
        </execution>
    </executions>
</plugin>

  <plugin>
    <groupId>org.jbehave</groupId>
    <artifactId>jbehave-maven-plugin</artifactId>
    <version>${jbehave.core.version}</version>
    <executions>
      <execution>
        <id>embeddable-stories</id>
        <phase>integration-test</phase>
        <configuration>
          <includes>
            <include>**/Stories.java</include>
          </includes>
          <excludes />
          <ignoreFailureInStories>true</ignoreFailureInStories>
          <verboseFailures>true</verboseFailures>
          <threads>5</threads>
          <metaFilters>
            <metaFilter>${meta.filter}</metaFilter>
          </metaFilters>
        </configuration>
        <goals>
          <goal>run-stories-as-embeddables</goal>
        </goals>
      </execution>
      <!-- THIS WORKS :) Copy the resources AFTER the execution is done -->
       <execution>
        <id>unpack-view-resources</id>
        <phase>integration-test</phase>
        <configuration>
            <viewDirectory>${basedir}/src/main/java/project/reports/${mavenTimestamp}</viewDirectory>
        </configuration>
        <goals>
          <goal>unpack-view-resources</goal>
        </goals>
      </execution>
    </executions>
  </plugin>
</plugins>

如果在運行時將文件夾設置為環境變量,則可以執行以下操作:

只是使用

    <properties>
        <REPORTS_LOCATION><${env.REPORTS_LOCATION}></REPORTS_LOCATION>
    </properties>

那么您可以通過pom中的$ {REPORTS_LOCATION}來引用該屬性

暫無
暫無

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

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