2011-09-19 33 views
1

我正在使用maven-assembly-plugin來打包我的構建。如何在Maven輸出中設置目錄權限?

我能夠執行文件集的某些複製並修改文件權限,但我無法修改目錄權限。從文檔中,我試圖用在我關心的目錄上。但是,無論我指定什麼權限,目錄總是基於當前的umask(0022)創建。 有誰知道在Maven構建期間以這種方式修改目錄權限的乾淨方式。唯一可行的是umask 0,但我寧願不要這樣做,因爲在這個項目上工作的每個人都必須擁有這個集合。

例行家assembly.xml:

<?xml version="1.0"?> 
<assembly> 
    <id>zip-with-dependencies</id> 
    <formats> 
    <format>dir</format> 
    <format>tar.gz</format> 
    </formats> 
    <includeBaseDirectory>true</includeBaseDirectory> 

    <dependencySets> 
    <dependencySet> 
     <includes> 
     <include>foo:bar</include> 
     </includes> 
     <outputDirectory>/resources/blah</outputDirectory> 
     <useProjectArtifact>true</useProjectArtifact> 
     <unpack>true</unpack> 
     <scope>runtime</scope> 
    </dependencySet> 
    </dependencySets> 

    <fileSets> 
    <fileSet> 
     <directory>${basedir}/src/main/web</directory> 
     <includes> 
     <include>some_dir</include> 
     </includes> 
     <outputDirectory>web</outputDirectory> 
     <fileMode>0777</fileMode> 
     <directoryMode>0777</directoryMode> 
    </fileSet> 
    </fileSets> 
</assembly> 
+0

好的,我無法讓maven-assembly-plugin正確設置目錄權限。我認爲這是Maven中的一個錯誤。我想出的最佳解決方案是添加exec-maven-plugin並從中手動調用chmod。我現在必須輸入「mvn clean package exec:exec」,但至少現在的權限是正確的。 –

回答

1

我發現了一個JIRA issue描述此行爲。一個解決方法應該是

<configuration> 
    <archiverConfig> 
     <fileMode>420</fileMode> <!-- 420(dec) = 644(oct) --> 
     <directoryMode>493</directoryMode> <!-- 493(dec) = 755(oct) --> 
     <defaultDirectoryMode>493</defaultDirectoryMode> 
    </archiverConfig> 
</configuration> 
+0

謝謝阿姆拉。我今天會試試這個。 –

+0

amra,這不是我的問題的解決方法。我想強制一個特定的目錄具有一定的權限。這個defaultDirectoryMode標記在文件集標記內是不允許的,並且將它作爲我的項目的全局行爲是不可接受的。但是,感謝你的職位。 –

+1

順便說一句,你可以指定那些模式與八位前導零,即0755和0644,它更容易。 – dlipofsky

1

我已經解決了這個問題,結合了pom.xml和程序集描述符中的設置。

在pom中指定整個zip文件的默認值。

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

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

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

      <configuration> 
       <descriptors> 
        <descriptor>src/main/assembly/descriptor.xml</descriptor> 
       </descriptors> 
       <archiverConfig> 
        <directoryMode>0755</directoryMode> 
        <defaultDirectoryMode>0755</defaultDirectoryMode> 
        <fileMode>0644</fileMode> 
       </archiverConfig> 
      </configuration> 
     </plugin> 

然後在程序集描述符中,我提供了不應該具有默認權限的個別文件夾的覆蓋。

<fileSets> 
    <fileSet> 
     <directory>src/conf</directory> 
     <outputDirectory>conf</outputDirectory> 
     <fileMode>0600</fileMode> 
     <directoryMode>0700</directoryMode> 
    </fileSet> 
    <fileSet> 
     <directory>src/db</directory> 
     <outputDirectory>db</outputDirectory> 
    </fileSet> 
    <fileSet> 
     <directory>src/bin</directory> 
     <outputDirectory>bin</outputDirectory> 
     <fileMode>0755</fileMode> 
    </fileSet> 

在這裏,在bin目錄中的文件將給予所有用戶可執行狀態。 conf目錄及其中的文件只能由所有者訪問,db目錄會繼承pom中設置的權限。

彙編文件設置在http://maven.apache.org/plugins/maven-assembly-plugin/assembly.html

描述我無法找到比阿姆拉確定的JIRA問題的其他配置部分的任何正式文件。

+0

謝謝加里。我還沒有設置測試,但如果其他人可以驗證這個作品,我會標記它的答案。 –

2

我有同樣的問題。我測試了上述所有解決方案,但都沒有爲我工作。 我想到的最好的解決方案是爲了預先創建這些父文件夾作爲空文件夾,然後才寫入它們。

所以,涉及到原來的問題,您應該使用:

<fileSet> 
    <directory>./</directory> 
    <outputDirectory>/resources</outputDirectory> 
    <excludes> 
     <exclude>*/**</exclude> 
    </excludes> 
    <directoryMode>0700</directoryMode> 
</fileSet> 

這要放在前的實際拷貝到資源的子文件夾中的例子。

./ - 只是一些現有的文件夾。它可以是任何其他文件夾,只要它存在即可。請注意,我們排除了fileSet中的任何文件。 因此,結果將是一個具有相應權限集的空文件夾。

在附註中,無論使用tar打包文件,如果沒有此設置,tar文件將不具有爲此父文件夾設置的權限。所以提取將導致一個新的文件夾,但與提取用戶+他的umask的權限。

0700當然僅用於示例。