2012-02-14 2 views
1

У меня есть два проекта maven внутри одной и той же папки. Один из них зависит от другого, т. Е. Имеет другой его зависимости. Теперь я хотел бы использовать плагин maven shade и launch4j, но мне это кажется сложным.Maven Shade Plugin + Launch4j

Может ли кто-нибудь дать мне пошаговое объяснение для моего дела?

Итак, у меня есть 2 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>org</groupId> 
    <artifactId>some artifact</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <packaging>pom</packaging> 

    <build> 
    <plugins> 
     <plugin> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <configuration> 
       <encoding>UTF-8</encoding> 
       <target>1.5</target> 
       <source>1.5</source> 
      </configuration> 
     </plugin> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-shade-plugin</artifactId> 
      <version>1.3.1</version> 
      <executions> 
       <execution> 
        <phase>package</phase> 
        <goals> 
         <goal>shade</goal> 
        </goals> 
        <configuration> 
         <transformers> 
          <!-- This bit sets the main class for the executable jar as you otherwise --> 
          <!-- would with the assembly plugin          --> 
          <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> 
           <manifestEntries> 
            <Main-Class>my_main class from project1</Main-Class> 
           </manifestEntries> 
          </transformer> 
          <!-- This bit merges the various GeoTools META-INF/services files   --> 
          <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/> 
         </transformers> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
</build> 
<modules> 
    <module>project1</module> 
    <module>project2</module> 
</modules> 
</project> 

, а затем я получаю следующее сообщение об ошибке: В проекта2: Не удалось создать тенистую артефакт, проект главный артефакт не существует.

+0

У вас есть два проекта на одной и той же папке, или у вас есть родительский проект с двумя модулями внутри? Можете ли вы предоставить более подробную информацию о структуре? – BrunoJCM

ответ

0

Вы должны настроить исполняемый файл на каждом модуле. В родительском помпе (что кажется, что вы помните, вы ничего не можете сделать). Вы должны пойти ПОМ каждого модуля вы хотите EXE-файл и делать то, что я отвечал на этот вопрос: Trying to integrate Launch4j in a Maven project using Alakai plugin

Я также ответил на этот другой вопрос о .exe файлов, но создавая консольный exe-файл (без графического интерфейса): Wrapping a java command line application with launch4j and maven , У этого есть полный pom и более новый.

Родительские проекты и помпы используются в основном для объединения сборки модулей, которые зависят друг от друга. Итак, в вашем случае, учитывая, что project2 зависит от project1, вы должны сделать это с pom project2 и настроить его, как я упоминал ранее.

1

Я обычно согласен с BrunoJCM, просто хочу добавить, что правила, которые вы поставили в родительский pom, применяются только к родительскому pom, они не «унаследованы», как вы намеревались. Поскольку родительский pom не создает никакой банки, все ваши настройки бесполезны.

Что вам нужно, это профиль, который всегда активируется. И профили унаследованы от родительского pom!

копировать-вставить правила, я надеюсь, что они работают как:

<profiles> 
    <profile> 
     <id>run-shade</id> 

     <activation> 
      <activeByDefault>true</activeByDefault> 
     </activation> 

     <build> 
      <plugins> 
       <plugin> 
        <artifactId>maven-compiler-plugin</artifactId> 
        <configuration> 
         <encoding>UTF-8</encoding> 
         <target>1.5</target> 
         <source>1.5</source> 
        </configuration> 
       </plugin> 
       <plugin> 
        <groupId>org.apache.maven.plugins</groupId> 
        <artifactId>maven-shade-plugin</artifactId> 
        <version>1.3.1</version> 
        <executions> 
         <execution> 
          <phase>package</phase> 
          <goals> 
           <goal>shade</goal> 
          </goals> 
          <configuration> 
           <transformers> 
            <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> 
             <manifestEntries> 
              <Main-Class>my_main class from project1</Main-Class> 
             </manifestEntries> 
            </transformer> 
            <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" /> 
           </transformers> 
          </configuration> 
         </execution> 
        </executions> 
       </plugin> 
      </plugins> 
     </build> 
    </profile> 
</profiles> 

Вы также хотите, чтобы настроить свой профиль в-подмодуль (например, основной класс). Вы можете сделать это, поместив переменную в своем родительском профиле пом:

<Main-Class>${main.class}</Main-Class> 

, а затем определение свойства в для каждого модуля ПОМ:

<properties> 
    <main.class>org.company.project.Main</main.class> 
</properties> 
0

попробуйте добавить исключает узла в чтобы исключить главный артефакт проекта. Смотрите аналогичные проблемы здесь: Project-Main-Artifact-Does-Not-Exist

     <configuration> 
          <transformers> 
           <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> 
            <manifestEntries> 
             <Main-Class>my_main class from project1</Main-Class> 
            </manifestEntries> 
           </transformer> 
           <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" /> 
          </transformers> 
          <excludes> 
           <exclude>${project.groupId}:${project.artifactId}</exclude> 
          </excludes> 
         </configuration> 
Смежные вопросы