2016-11-27 4 views
1

Новый для Maven, я пытался скомпилировать проект с использованием Maven с maven-shade-plugin (как кажется, лучший плагин для создания толстой банки там). Я попытался указать мой основной класс, чтобы создать исполняемый файл jar и некоторые .properties файлы, которые содержат строки перевода.Maven: скомпилируйте проект, используя теневой плагин, определяющий основной класс и файл свойств

Компиляция и сборка, кажется, прошло, по выходу Netbeans, но я не могу запустить его следующим образом («программу», предполагая, баночка построен Maven переименован):

/usr/bin/java -cp program.jar bot.Main 
> could not find or load main class bot.Main 

это мой файл проекта структура:

project files

и это мой 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.mycompany</groupId> 
<artifactId>mavenproject1</artifactId> 
<version>1.0-SNAPSHOT</version> 
<packaging>jar</packaging> 
<build> 
    <resources> 
    <resource> 
     <directory>src/main/java/resources</directory> 
     <includes> 
      <include>**/*.properties</include> 
     </includes> 
    </resource> 
</resources> 
<plugins> 

    <plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-shade-plugin</artifactId> 
    <version>2.4.3</version> 
    <configuration> 
     <archive> 
     <manifest> 
     <addClasspath>true</addClasspath> 
     <classpathPrefix>lib/</classpathPrefix> 
     <mainClass>bot.Main</mainClass> 
     </manifest> 
    </archive> 
    <shadedArtifactAttached>true</shadedArtifactAttached> 
    <shadedClassifierName>launcher</shadedClassifierName> 
    </configuration> 
    <executions> 
     <execution> 
     <phase>package</phase> 
     <goals> 
      <goal>shade</goal> 
     </goals> 
     </execution> 
    </executions> 
    </plugin> 

    <plugin> 
     <groupId>org.codehaus.mojo</groupId> 
     <artifactId>exec-maven-plugin</artifactId> 
     <version>1.2.1</version> 
     <executions> 
      <execution> 
       <goals> 
        <goal>java</goal> 
       </goals> 
      </execution> 
     </executions> 
     <configuration> 
      <mainClass>bot.Main</mainClass> 
     </configuration> 
    </plugin> 

</plugins> 
</build> 
<dependencies> 
    <dependency> 
     <groupId>org.telegram</groupId> 
     <artifactId>telegrambots</artifactId> 
     <version>2.4.0</version> 
     <classifier>jar-with-dependencies</classifier> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.commons</groupId> 
     <artifactId>commons-lang3</artifactId> 
     <version>3.5</version> 
    </dependency> 
</dependencies> 
<properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    <maven.compiler.source>1.8</maven.compiler.source> 
    <maven.compiler.target>1.8</maven.compiler.target> 
</properties> 
</project> 

Правильно ли включены ресурсы и почему я не могу запустить свою программу с помощью команды java -jar без указания основного класса? Он говорит мне «недопустимый или поврежденный файл jar», который должен означать, что это невозможно.

Кроме того, почему ни один из них не задает основной путь класса?

ответ

1

Этот вопрос с конфигурацией Shade плагин, который в настоящее время

<configuration> 
    <archive> 
    <manifest> 
     <addClasspath>true</addClasspath> 
     <classpathPrefix>lib/</classpathPrefix> 
     <mainClass>bot.Main</mainClass> 
    </manifest> 
    </archive> 
    <shadedArtifactAttached>true</shadedArtifactAttached> 
    <shadedClassifierName>launcher</shadedClassifierName> 
</configuration> 

Там нет <archive> параметра в shade goal. Тот факт, что вы используете элемент конфигурации, который не существует is not an error, конфигурация будет просто проигнорирована, и это объясняет, почему ваш основной класс не задан в манифесте.

Чтобы создать исполняемый JAR с плагином Shade, вам необходимо to provide the ManifestResourceTransformer как transformers. Правильная конфигурация будет:

<configuration> 
    <transformers> 
    <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> 
     <mainClass>bot.Main</mainClass> 
    </transformer> 
    </transformers> 
    <shadedArtifactAttached>true</shadedArtifactAttached> 
    <shadedClassifierName>launcher</shadedClassifierName> 
</configuration> 

Обратите внимание, что с этой конфигурацией, заштрихованная JAR не заменит основной файл JAR. shadedArtifactAttached установлен в true, что означает, что затененный JAR будет прикреплен к проекту как вторичный артефакт. Он будет отличаться от основного JAR с его классификатором launcher, то есть с параметром shadedClassifierName.

После запуска mvn clean package на этом проекте, вы будете иметь 2 баночки создан:

  • mavenproject1-1.0-SNAPSHOT.jar, который является основным файлом JAR. Этот JAR состоит только из скомпилированных источников Java вашего приложения. Он не является исполняемым и не содержит в нем все классы зависимостей.
  • mavenproject1-1.0-SNAPSHOT-launcher.jar - затененный прикрепленный JAR, который был создан плагином Shade. Он является исполняемым и содержит классы зависимостей.

Это означает, что если вы хотите, чтобы запустить приложение в виде исполняемого файла JAR, вы должны запустить -launcher.jar, а не другой, с

java -jar mavenproject1-1.0-SNAPSHOT-launcher.jar 

В качестве побочного ноты , оба JAR будут содержать ваши ресурсы, которые находятся в <directory>src/main/java/resources</directory>, потому что они являются ресурсами самого проекта, как объявлено с помощью элемента <resource>. Однако было бы предпочтительнее соблюдать standard directory layout и вместо этого размещать ресурсы в src/main/resources.

+0

спасибо! Но когда я пытаюсь запустить его, я получаю сообщение 'невозможно получить доступ к jarfile'. Это что-то еще связано с настройками плагина тени? – A7X

+1

@ A7X Похоже, что вы не запускали команду 'java -jar' в нужном месте. JAR не находится в каталоге, в котором вы его запустили. Если вы находитесь в своем проекте, он находится в папке «target», а не в корневой папке. Однако это не связано с плагином Shade. – Tunaki

+0

Да, это была моя вина. Кстати, я все еще получаю MissingResourceBundleException, не могу найти пакет для resources.strings locale en_US. Я включаю их в свой проект, используя 'ResourceBundle.getBundle (« resources.strings », новый Locale (« en »,« US »), загрузчик);' потому что я передаю неправильный путь к ресурсам? Должно быть, это полный путь? – A7X