2017-02-05 9 views
1

Я создал файл maven jar из eclipse. Ошибка при запуске jar.Ошибка во время работы файла maven jar

Ошибка:

A JNI error has occurred, please check your installation and try again 

    Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/fs/FSDataOutputStream 
    at java.lang.Class.getDeclaredMethods0(Native Method) 
    at java.lang.Class.privateGetDeclaredMethods(Unknown Source) 
    at java.lang.Class.privateGetMethodRecursive(Unknown Source) 

Пожалуйста, руководство нужно ли какие-либо зависимости, которые будут добавлены в pom.xml

pom.xml

<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>utd.bigdata</groupId> 
    <artifactId>hadoop1</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <name>hw1</name> 
    <dependencies> 
    <dependency> 
     <groupId>org.apache.hadoop</groupId> 
     <artifactId>hadoop-client</artifactId> 
     <version>2.4.1</version> 
    </dependency> 
    <dependency> 
    <groupId>org.apache.hadoop</groupId> 
     <artifactId>hadoop-common</artifactId> 
     <version>2.7.3</version> 
     <scope>compile</scope> 
     </dependency> 
    <!-- <dependency> 
    <groupId>org.apache.hadoop</groupId> 
    <artifactId>hadoop-auth</artifactId> 
    <version>2.4.1</version> 
</dependency>--> 
    </dependencies> 
    <build> 
    <plugins> 
     <plugin> 
      <!-- Build an executable JAR --> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-jar-plugin</artifactId> 
      <version>2.4</version> 
      <configuration> 
       <archive> 
        <manifest> 
         <mainClass>bigdata.UploadHadoop</mainClass> 
         <classpathPrefix>classes/lib</classpathPrefix> 
        </manifest> 
       </archive> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 
</project> 

Кроме того, есть ли ошибка в pom.xml? Пожалуйста, предложите любые изменения кода

+0

Не могли бы вы рассказать о том, как вы управляете банкой? Это через отладку Eclipse/время выполнения? Это командная строка? Что такое команда командной строки? – ProgrammersBlock

ответ

1

Обычный архив .jar не содержит его зависимостей a т во время выполнения, для этого вы можете использовать Maven-сборочный-плагин для создания жира исполняемого Jar:

https://maven.apache.org/plugins/maven-assembly-plugin/usage.html

<!-- Create a fat Jar --> 
<plugin> 
    <artifactId>maven-assembly-plugin</artifactId> 
    <executions> 
    <execution> 
     <phase>package</phase> 
     <goals> 
     <goal>single</goal> 
     </goals> 
    </execution> 
    </executions> 
    <configuration> 
    <archive> 
     <manifest> 
     <mainClass>bigdata.UploadHadoop</mainClass> 
     </manifest> 
    </archive> 
    <descriptorRefs> 
     <descriptorRef>jar-with-dependencies</descriptorRef> 
    </descriptorRefs> 
    </configuration> 
</plugin> 
0

В качестве альтернативы «жир банки», то Hadoop баночки бегун также поддерживает Формат «jar of jars». Стоит отметить, что он не является стандартным для фляги, но поскольку он поддерживается в hadoop, вот он: How do I put all required JAR files in a library folder inside the final JAR file with Maven?

Этот формат является обычным банком, но с папкой lib /, содержащей все банки с зависимостями.

0

Если вы используете maven-jar-plugin для создания исполняемой банки, прочитайте документ. http://maven.apache.org/shared/maven-archiver/examples/classpath.html#Make

Сначала добавьте Maven-Jar-плагин в pom.xml

<build> 
    <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-jar-plugin</artifactId> 
     ... 
     <configuration> 
      <archive> 
      <manifest> 
       <addClasspath>true</addClasspath> 
       <mainClass>bigdata.UploadHadoop</mainClass> 
       <classpathPrefix>classes/lib</classpathPrefix> 
      </manifest> 
      </archive> 
     </configuration> 
     ... 
     </plugin> 
    </plugins> 
    </build> 

Во-вторых, он не придает банки зависимостями к банку проекта. Поэтому вы должны быть уверены, что баны зависимости (hasoop-client, hasoop-common) находятся в классах/lib сами.

В конце концов, я полагаю, что вы используете Maven-тень-плагин, чтобы создать исполняемую банку (жир банку) http://maven.apache.org/plugins/maven-shade-plugin/examples/executable-jar.html Он приложит банки зависимостей к результату тени банке сам по себе. Вы также используете maven-assembly-plugin для создания исполняемого банку, но не рекомендуется.

<build> 
    <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-shade-plugin</artifactId> 
     <version>3.0.0</version> 
     <executions> 
      <execution> 
      <phase>package</phase> 
      <goals> 
       <goal>shade</goal> 
      </goals> 
      <configuration> 
       <transformers> 
       <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> 
        <mainClass>bigdata.UploadHadoop</mainClass> 
       </transformer> 
       </transformers> 
      </configuration> 
      </execution> 
     </executions> 
     </plugin> 
    </plugins> 
    </build> 
+0

Привет, у меня есть очень глупая проблема, в которую я попал. У меня есть простой (просто печатать привет мир) .class файл локально, который я могу преобразовать его в .jar и запустить его локально без проблем. Тем не менее, когда я помещаю его в свой кластер хаоса, я сталкиваюсь с глупой ошибкой: JAR не существует или не является нормальным файлом: /usr/reihan/test.jar. Я также должен упомянуть, что я могу запускать примеры, основанные на hasoop wordcount без проблем, но когда я хочу запустить свою собственную банку, я сталкиваюсь с этой проблемой. Есть идеи? –