0

我正在爲我的項目創建一個uber jar,即具有依賴項的jar。我有一堆項目使用的屬性文件。我希望能夠在運行我的項目之前更改這些屬性文件,所以我希望它們在jar之外。這是我的聚甲醛的有關章節Uber jar沒有讀取外部屬性文件

<build> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>3.6.1</version> 
       <configuration> 
        <source>1.8</source> 
        <target>1.8</target> 
       </configuration> 
      </plugin> 
      <plugin> 
       <artifactId>maven-assembly-plugin</artifactId> 
       <version>2.2</version> 
       <configuration> 

        <artifactSet> 
         <excludes> 
          <exclude>**/*.properties</exclude> 
          <exclude>**/*.json</exclude> 
         </excludes> 
        </artifactSet> 
        <descriptorRefs> 
         <descriptorRef>jar-with-dependencies</descriptorRef> 
        </descriptorRefs> 
        <archive> 
         <manifest> 
          <mainClass>path.to.main.Main</mainClass> 
         </manifest> 
         <manifestEntries> 
          <Class-Path>.</Class-Path> 
          <Class-Path>conf/</Class-Path> 
         </manifestEntries> 
        </archive> 
       </configuration> 
       <executions> 
        <execution> 
         <id>make-assembly</id> 
         <phase>package</phase> 
         <goals> 
          <goal>single</goal> 
         </goals> 
        </execution> 
       </executions> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-resources-plugin</artifactId> 
       <version>2.4</version> 
       <executions> 
        <execution> 
         <id>copy-resources</id> 
         <phase>install</phase> 
         <goals> 
          <goal>copy-resources</goal> 
         </goals> 
         <configuration> 
          <outputDirectory>${basedir}/target/conf</outputDirectory> 
          <resources> 
           <resource> 
            <directory>src/main/resources</directory> 
            <includes> 
             <include>**/*.properties</include> 
             <include>**/*.json</include> 
            </includes> 
           </resource> 
          </resources> 
         </configuration> 
        </execution> 
       </executions> 
      </plugin> 
     </plugins> 
    </build> 

所以基本上,我想創建一個文件夾${basedir}/target/conf和所有.properties.json文件複製到它。另外,這裏是我正在讀

InputStream in = this.getClass().getClassLoader().getResourceAsStream("filename.properties"); 

我現在面臨幾個問題

  1. 當我做mvn clean install的文件,我仍然看到classes文件夾中的所有.properties.json文件。他們不應該被排除在外

  2. conf文件夾的所有文件的創建,但是當我運行jar ADN試圖改變屬性,在更改不會拿起。我如何確保conf文件夾被添加到類路徑中?

  3. 我希望能夠在我正在開發,所以我不希望把它們放在一個單獨的文件夾,從文件夾src/main/resources加載.properties.json文件。這可能嗎?

回答

0

我正面臨着Uber jar沒有讀取外部配置文件的問題。 我試過下面的配置,它的工作就像魅力。請參閱下面的配置,它可以幫助有問題的人使用超級罐子不讀取extenarl文件。 我不知道這是否是最好的方式,但沒有發現任何soultion在線:)

  1. 我已經包括使用IncludeResourceTransformer的資源。
  2. 使用過濾器從uber jar中刪除了屬性文件。
  3. 在classpath/conf中讀取外部文件夾的屬性。

    <plugin> 
         <groupId>org.apache.maven.plugins</groupId> 
         <artifactId>maven-shade-plugin</artifactId> 
         <version>2.3</version> 
         <executions>   <!-- Run shade goal on package phase --> 
          <execution> 
           <phase>package</phase> 
           <goals> 
            <goal>shade</goal> 
           </goals> 
           <configuration> 
            <transformers> 
             add Main-Class to manifest file 
             <transformer 
              implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> 
              <manifestEntries> 
               <Main-Class>JobName</Main-Class> 
               <Class-Path>conf/</Class-Path> 
              </manifestEntries> 
             </transformer> 
             <transformer 
              implementation="org.apache.maven.plugins.shade.resource.IncludeResourceTransformer"> 
              <resource>src/main/resources/config.properties</resource> 
              <file>${project.basedir}/src/main/resources/config.properties</file> 
             </transformer> 
            </transformers> 
            <finalName>FinalJarName</finalName> 
            <filters> 
             <filter> 
              <artifact>groupId:artifactId</artifact> 
              <excludes> 
               <exclude>**/*.properties</exclude> 
              </excludes> 
             </filter> 
            </filters> 
           </configuration> 
          </execution> 
         </executions> 
        </plugin> 
    

好運。