баночка мавена, не включенная в манифест - PullRequest
0 голосов
/ 20 января 2019

Мне пришлось возродить старый проект, который работал около полутора лет назад, но теперь, когда я делаю:

mvn clean install

либо в командной строке, либо через eclipse, он компилируется нормально, но недобавить основной класс в манифест И У меня есть правильная директива.

Я использую:

  • Apache Maven 3.5.4
  • JDK 10.0.2
  • затмение 4.8.0 (Фотон)

Итак, вот сокращенная версия 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/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>
    <groupId>com.a.b.c</groupId>
    <artifactId>JarNameHere</artifactId>
    <version>0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <properties>
        <log4j.version>2.4</log4j.version> 
        <http.client.version>4.5.2</http.client.version>
        <maven.compiler.source>10</maven.compiler.source>
        <maven.compiler.target>10</maven.compiler.target>
    </properties>

    <dependencies>
       <!-- DEPENDENCIES HERE, BUT REMOVED TO MAKE MORE READABLE -->
       ...
    </dependencies>
    <build>
        <pluginManagement>
            <plugins>
                <!-- Maven Assembly Plugin -->
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-assembly-plugin</artifactId>
                    <configuration>
                        <!-- get all project dependencies -->
                        <descriptorRefs>
                            <descriptorRef>jar-with-dependencies</descriptorRef>
                        </descriptorRefs>
                        <!-- MainClass in mainfest make a executable jar -->
                        <archive>
                            <manifest> 
                                <mainClass>com.a.b.c.MainClass</mainClass>
                            </manifest>
                        </archive>
                    </configuration>
                    <executions>
                        <execution>
                            <id>make-assembly</id>
                            <phase>package</phase>
                            <goals>
                                <goal>single</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
                <!-- AspectJ configuration -->
                <plugin>
                    <groupId>org.codehaus.mojo</groupId>
                    <artifactId>aspectj-maven-plugin</artifactId>
                    <version>1.11</version>
                    <configuration>
                        <complianceLevel>1.11</complianceLevel>
                    </configuration>
                    <executions>
                        <execution>
                            <goals>
                                <goal>compile</goal>
                                <goal>test-compile</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
                <!--  -->
            </plugins>
        </pluginManagement>
    </build>
</project>

Ответы [ 2 ]

0 голосов
/ 17 февраля 2019

Я не сомневаюсь, что ответ, данный @kriegaex, будет работать до Java 9, так как мой старый pom.xml годами работал на Java 8. Оказывается, Я не дал достаточно информации в моем вопросе, чтобы правильно ответить на это. Это было мое обновление с Java 8 до Java 10, которое испортило интеграцию AspectJ, так что она потерпит неудачу, прежде чем Maven приступит к созданию jar.

Примечание: Я буду продолжать уточнять это, поскольку может быть лучше использовать тег pluginManagement. К сожалению, я не изменяю pom.xml, который часто отличается от простых тегов зависимостей. Так что я на короткое время хорошо справляюсь с трудными делами, только чтобы никогда не трогать / не вносить серьезных изменений в течение многих лет, забывая все, чему научился в прошлый раз.

Я нашел решение здесь: Плагин Maven AspectJ не удается собрать с Java 9 из-за отсутствия tools.jar

АКТУАЛЬНОЕ РЕШЕНИЕ: Изменение нескольких строк в моем pom.xml дало результат:

            <groupId>com.github.m50d</groupId>
            <artifactId>aspectj-maven-plugin</artifactId>
            <version>1.11.1</version>
<!--
            THESE WERE THE ORIGINAL LINES
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>aspectj-maven-plugin</artifactId>
            <version>1.11</version>
 -->                

Я понял это, выполнив это в командной строке:

mvn -X clean install

Даже последняя версия AspectJ все еще искала файл tools.jar:

<properties>
    <!-- Other lines removed for brevity -->
    <aspect.version>1.9.1</aspect.version>
</properties>

<dependencies>
    <!-- https://mvnrepository.com/artifact/com.machinepublishers/jbrowserdriver -->
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjrt</artifactId>
        <version>${aspect.version}</version>
    </dependency>
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjtools</artifactId>
        <version>${aspect.version}</version>
    </dependency>
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>${aspect.version}</version>
    </dependency>

    <!-- OTHER DEPENDENCIES REMOVED FOR BREVITY -->
 </dependencies>
<build>
    <plugins>
        <!-- Maven Assembly Plugin -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <executions>
                <execution>
                    <id>make-assembly</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                    <configuration>
                        <!-- get all project dependencies -->
                        <descriptorRefs>
                            <descriptorRef>jar-with-dependencies</descriptorRef>
                        </descriptorRefs>
                        <!-- MainClass in mainfest make a executable jar -->
                        <archive>
                            <manifest>   
  <mainClass>a.b.c.Foo</mainClass>
                            </manifest>
                        </archive>
                    </configuration>
                </execution>
            </executions>
        </plugin>

        <!-- AspectJ configuration -->
        <plugin>
            <groupId>com.github.m50d</groupId>
            <artifactId>aspectj-maven-plugin</artifactId>
            <version>1.11.1</version>
<!--
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>aspectj-maven-plugin</artifactId>
            <version>1.11</version>
 -->                
            <configuration>
                <!-- MUST use 10, NOT 1.10 or ajc breaks -->
                <complianceLevel>10</complianceLevel>
                <source>10</source>
                <target>10</target>
                <showWeaveInfo>true</showWeaveInfo>
                <verbose>true</verbose>
                <Xlint>ignore</Xlint>
                <encoding>UTF-8</encoding>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>compile</goal>       <!-- use this goal to weave all your main classes -->
                        <goal>test-compile</goal>  <!-- use this goal to weave all your test classes -->
                    </goals>
                </execution>
            </executions>
        </plugin>
     <!--  -->
    </plugins>
</build>
0 голосов
/ 10 февраля 2019

Вы допустили классическую ошибку новичка: вы предполагаете, что плагины, настроенные в разделе pluginManagement, будут автоматически использоваться во время сборки.На самом деле они не будут.Ни AspectJ Maven, ни Assembly не будут работать таким образом, поэтому, конечно, в вашем каталоге target не будет JAR с зависимостями.

Вам также необходимо явно добавить плагины в раздел plugins,ссылаясь на них, по крайней мере, по идентификатору группы и имени (там нет необходимости указывать версию или конфигурацию, если только вы не хотите переопределить то, что вы уже определили в pluginManagement).

Кроме того, вы заметите, что AspectJ Maven по-прежнему неправильно настроен исборка не удастся, как только плагин активирован.Но это выходит за рамки вашего вопроса, поэтому я не буду подробно останавливаться на этом здесь.

PS: я скопировал ваши настройки в собственное POM, исправил их и могу подтвердить это, как только плагин AspectJимеет правильные настройки, плагин Assembly выполняет свою работу, как и ожидалось, включая манифест с правильным основным классом.


Обновление: Таким образом, вы предоставляете только фрагмент POM без кода для компиляциии беги, но ты хочешь увидеть мое полное ПОМ.Я нахожу это немного странным, потому что на самом деле вы должны предоставить MCVE .Но в любом случае вот что у меня есть: я просто включил ваш сборочный плагин в один из моих собственных проектов, где я обычно использую плагин One-JAR (создаю исполняемый JAR из JAR), заменил свой плагин на ваш и проверил, могу ли я запуститьвыполнимый с java -jar ....Тест прошел успешно.Я все еще на JDK 8, однако, по этому вопросу я не обновил всю свою систему сборки.Для примера я также удалил все мои другие зависимости, кроме AspectJ runtime.

<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>com.a.b.c</groupId>
  <artifactId>JarNameHere</artifactId>
  <version>0.1-SNAPSHOT</version>

  <properties>
    <maven.compiler.source>8</maven.compiler.source>
    <maven.compiler.target>8</maven.compiler.target>
    <main-class>com.a.b.c.MainClass</main-class>
    <aspectj.version>1.8.13</aspectj.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <build>

    <pluginManagement>
      <plugins>
        <!-- Maven Assembly Plugin -->
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-assembly-plugin</artifactId>
          <configuration>
            <!-- get all project dependencies -->
            <descriptorRefs>
              <descriptorRef>jar-with-dependencies</descriptorRef>
            </descriptorRefs>
            <!-- MainClass in mainfest make a executable jar -->
            <archive>
              <manifest>
                <mainClass>${main-class}</mainClass>
              </manifest>
            </archive>
          </configuration>
          <executions>
            <execution>
              <id>make-assembly</id>
              <phase>package</phase>
              <goals>
                <goal>single</goal>
              </goals>
            </execution>
          </executions>
        </plugin>
        <!-- AspectJ configuration -->
        <plugin>
          <groupId>org.codehaus.mojo</groupId>
          <artifactId>aspectj-maven-plugin</artifactId>
          <version>1.11</version>
          <configuration>
            <!--<showWeaveInfo>true</showWeaveInfo>-->
            <source>${maven.compiler.source}</source>
            <target>${maven.compiler.target}</target>
            <Xlint>ignore</Xlint>
            <complianceLevel>${maven.compiler.target}</complianceLevel>
            <encoding>${project.build.sourceEncoding}</encoding>
            <!--<verbose>true</verbose>-->
            <!--<warn>constructorName,packageDefaultMethod,deprecation,maskedCatchBlocks,unusedLocals,unusedArguments,unusedImport</warn>-->
          </configuration>
          <executions>
            <execution>
              <phase>process-sources</phase>
              <goals>
                <goal>compile</goal>
                <goal>test-compile</goal>
              </goals>
            </execution>
          </executions>
        </plugin>
      </plugins>
    </pluginManagement>

    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-assembly-plugin</artifactId>
      </plugin>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>aspectj-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>

  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjrt</artifactId>
        <version>${aspectj.version}</version>
        <scope>runtime</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>

  <dependencies>
    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjrt</artifactId>
    </dependency>
  </dependencies>

</project>
...