Исключение ClassNotFound при использовании плагина Maven Shade - PullRequest
2 голосов
/ 09 сентября 2011

Я пытаюсь перейти по этой ссылке: http://maven.apache.org/plugins/maven-shade-plugin/examples.html

Я новичок в Maven. Я чувствую себя немного не в своей тарелке, пытаясь последовать примеру.

Я могу заставить Quartz Scheduler работать с Spring. Я хочу иметь возможность запустить его из командной строки, используя файл JAR.

Вот список классов и pom-файлов, которые я использовал.

shade maven plugin

EDIT:

Я могу получить файл с банкой тени. Я использовал mvn clean install

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

C:\Users\SpringExample\target>java -jar SpringExample-1.0-SNA PSHOT-shaded.jar Exception in thread "main" java.lang.NoClassDefFoundError: org/sonatype/haven/Ex odusCli Caused by: java.lang.ClassNotFoundException: org.sonatype.haven.ExodusCli at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) Could not find the main class: org.sonatype.haven.ExodusCli. Program will exit.

EDIT2:

Я использовал следующее в приведенной выше ссылке, используя эту ссылку:

http://seanfreitag.wordpress.com/2011/07/25/create-an-executable-jar-with-dependencies-using-maven/

 <project>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>1.4</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>org.sonatype.haven.ExodusCli</Main-Class>
                    <Build-Number>123</Build-Number>
                  </manifestEntries>
                </transformer>
                <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                  <resource>META-INF/spring.handlers</resource>
                </transformer>
                <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                  <resource>META-INF/spring.schemas</resource>
                </transformer>
              </transformers>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  ...
</project>

Ответы [ 3 ]

2 голосов
/ 09 сентября 2011

Я не использовал Shade, но подозреваю, что:

  • пом, который вы используете для вызова Shade, не отображается

  • пример Maven, показывающий, как установить Main-Class, предполагает, что класс org.sonatype.haven.HavenCli находится где-то в сборке jar

  • такого класса у вас нет

  • вы должны изменить имя класса в вашем <mainClass>org.sonatype.haven.HavenCli</mainClass> на то, что вы хотите использовать в качестве основного класса

1 голос
/ 09 сентября 2011

ОБНОВЛЕНИЕ: Вам необходимо указать атрибут Main-Class в Manifest.mf в вашем банке. Для этого см. Пример «Плагин Shade, где в MANIFEST.MF добавлен основной класс».

-

Да, вы должны встроить код плагина в ваш файл pom, как показано ниже

<project>
       <!-- Other tags -->
        ---
    <build>
      <plugins>
        <plugin>
           ---
        </plugin>
      </plugins>
    </build>`
</project>

Возможно, вы включили <plugin> в качестве прямого потомка <project> в файл pom. Это не работает.

Обычный способ построения maven проектов с mvn install (или mvn package) создаст затененный jar, если указана конфигурация плагина shade. Итак, будет две банки; оригинальная банка и баночка убера.

исключить: Как правило, uber jar будет включать в себя все классы из списка dependencies jar в pom. excludes указывает набор файлов jar, которые НЕ должны находиться в затененном jar. Если вы внимательнее посмотрите на пример, он исключает junit: junit jar, что означает, что классы в junit не будут в вашем uber jar.

0 голосов
/ 30 мая 2019

Добавьте следующий фрагмент к вашему плагину. Это должно помочь.

 <artifactSet>
    <includes>
        <include>org.sonatype.haven.ExodusCli:*</include>
    </includes>
 </artifactSet>
...