2012-04-10 3 views
2

Я работаю над своим первым проектом Maven, который в конечном итоге упакует приложение Java в пакете Debian (с использованием плагина jdeb). Я пытаюсь использовать плагин сборки для создания файла tar, но похоже, что сгенерированный файл не всегда содержит записи в каталоге, что приведет к сбою dpkg.Плагин сборки Maven не создает файлы tar с записями каталога?

Кто-нибудь видел это раньше?

В частности, генерируемый архивный файл не содержит записи каталога для:

  • в FileSet, задающее <includes> (выезд <includes> приведет к записи каталога междунар он TAR-файл)
  • в dependencySet

Вот файл сборки, который не использует <includes>

<assembly 
xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd"> 
<id>simple</id> 
<formats> 
    <format>tar</format> 
</formats> 
<includeBaseDirectory>false</includeBaseDirectory> 

<moduleSets> 
</moduleSets> 
<fileSets> 
    <fileSet> 
     <directory>src/main/config</directory> 
     <outputDirectory>/etc/${project.artifactId}</outputDirectory> 

    </fileSet> 
</fileSets> 

<dependencySets> 

    <dependencySet> 
     <outputDirectory>/usr/lib/${project.artifactId}/lib</outputDirectory> 
     <scope>runtime</scope> 
     <useProjectArtifact>true</useProjectArtifact> 
    </dependencySet> 

</dependencySets> 
<repositories> 
</repositories> 
<componentDescriptors /> 
</assembly> 

Вот содержимое файла дегтя:

tar tvf assembly-test-0.0.1-SNAPSHOT-simple.tar 
drwxr-xr-x 0/0    0 2012-04-10 12:54 etc/assembly-test/ 
-rw-r--r-- 0/0    0 2012-04-10 12:52 etc/assembly-test/file1.xml 
-rw-r--r-- 0/0    0 2012-04-10 12:52 etc/assembly-test/file2.xml 
-rw-r--r-- 0/0   2131 2012-04-10 13:26 usr/lib/assembly-test/lib/assembly-test-0.0.1-SNAPSHOT.jar 

Теперь, если я использую сборку с некоторыми включают модели:

<assembly 
xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd"> 
<id>include-match</id> 
<formats> 
    <format>tar</format> 
</formats> 
<includeBaseDirectory>false</includeBaseDirectory> 

<moduleSets> 
</moduleSets> 
<fileSets> 
    <fileSet> 
     <directory>src/main/config</directory> 
     <outputDirectory>/etc/${project.artifactId}</outputDirectory> 
     <includes> 
      <include>*.xml</include> 
     </includes> 
    </fileSet> 
</fileSets> 

<dependencySets> 

    <dependencySet> 
     <outputDirectory>/usr/lib/${project.artifactId}/lib</outputDirectory> 
     <scope>runtime</scope> 
     <useProjectArtifact>true</useProjectArtifact> 
    </dependencySet> 

</dependencySets> 
<repositories> 
</repositories> 
<componentDescriptors /> 
</assembly> 

Содержимое файла дегтя теряет запись каталога:

tar tvf assembly-test-0.0.1-SNAPSHOT-include-match.tar 
-rw-r--r-- 0/0    0 2012-04-10 12:52 etc/assembly-test/file1.xml 
-rw-r--r-- 0/0    0 2012-04-10 12:52 etc/assembly-test/file2.xml 
-rw-r--r-- 0/0   2131 2012-04-10 13:26 usr/lib/assembly-test/lib/assembly-test-0.0.1-SNAPSHOT.jar 

Это похоже на ошибку в плагине сборки, хотя я все еще экспериментирую с ней. Я могу, конечно, обойти его (используйте preinst-скрипт в пакете, возможно, создайте структуру каталогов для jdeb для сборки), но я хотел бы сохранить как можно больше в файле дескриптора.

+0

Возможно, потому, что первый набор файлов (без «включает») копирует весь каталог, а вторая версия (с «включает») копирует только сопоставленный шаблон («xml»), а каталог не соответствует этот шаблон? – Glenn

+0

Каждый раз, когда я пробовал шаблоны подстановок с включением, запись в каталог не добавляется в tar - любое включение, кажется, предотвращает ее. Но только с шаблоном exclude создается запись _is_.Это кажется непоследовательным и, возможно, просто побочным продуктом того, как каталог фильтруется. – user1325158

ответ

0

Думаю, я могу ответить на этот вопрос методом, который может заставить создать записи каталога в файлах tar (я действительно нашел это в другом месте, но не помню, где) - добавьте fileSet, исключая все содержимое, например:

 <!-- force entry for /usr/lib/${project.artifactId} --> 
     <fileSet> 
      <directory></directory> 
      <outputDirectory>/usr/lib/${project.artifactId}</outputDirectory> 
      <excludes> 
       <exclude>*/**</exclude> 
      </excludes> 
     </fileSet> 

Не изящный, и он содержит подробные сведения, если у вас много каталогов, но он работает. Однако для моего конкретного случая создания пакета debian я в итоге использовал плагин Assembly для сборки сборки формата «каталог», а затем использовал плагин jdeb в структуре каталогов (и установил файлы), который оказался немного проще в целом.

0

Там простой способ обойти это, просто включите каталоги, которые вы хотите или «** /», если вы хотите, чтобы все из них, так, например:

<include>mydir/**/</include> 

Примечания тянущегося /, как это вещь, которая тянет в каталоге. Я думаю, что текущее поведение, вероятно, преднамеренное, поскольку включение, похоже, втягивает именно то, что вы включаете, и ничего больше. В стороне, хотя полученный tarball не удовлетворяет npm, поэтому поддержка maven все еще кажется немного подозрительной.

Смежные вопросы