2016-07-16 462 views
2

我创建了一个Maven项目并在pom.xml文件中添加了一个依赖项apache commons-io。运行Maven项目时出错java.lang.ClassNotFoundException:org.apache.commons.io.IOUtils

<dependency> 
    <groupId>commons-io</groupId> 
    <artifactId>commons-io</artifactId> 
    <version>2.4</version> 
</dependency>` 

我添加依赖共同-io的,所以我可以以阅读从资源文件夹中的文件中使用commons.io.IOUtils在我的项目。 /src/main/resources/file/file.txt。编制和包装,但在

一切正常,当我运行jar

java命令的目标/行家-1.0-SNAPSHOT.jar com.sample.exercise.Main

我得到这个错误

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/io/IOUtils 
     at com.sample.exercise.Main.getFileWithUtil(Main.java:21) 
     at com.sample.exercise.Main.main(Main.java:13) 
    Caused by: java.lang.ClassNotFoundException: org.apache.commons.io.IOUtils 
     at java.net.URLClassLoader.findClass(URLClassLoader.java:381) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
     at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
     ... 2 more 
` 

这里是我的代码

package com.sample.exercise; 

    import java.io.*; 
    import java.util.*; 
    import org.apache.commons.io.IOUtils; 

    public class Main{ 

     public static void main(String[] args) { 
      Main main = new Main(); 
      System.out.println(main.getFile("file/fileTable.txt")); 

     } 

     private String getFileString fileName) { 
      String result = ""; 
      ClassLoader classLoader = getClass().getClassLoader(); 
      try { 
      result =IOUtils.toString(classLoader.getResourceAsStream(fileName)); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return result; 
     } 
} 

有什么问题。你能帮助我吗? TIA

回答

0

变化的依赖性,

<dependency> 
    <groupId>org.apache.commons</groupId> 
    <artifactId>commons-io</artifactId> 
    <version>1.3.2</version> 
</dependency> 

试着做,行家干净,和Maven安装Maven的命令是操作系统特定的,但它确实是相同的。

尝试添加,下面你的pom.xml

<plugin> 
    <artifactId>maven-assembly-plugin</artifactId> 
    <version>2.4</version> 
    <configuration> 
     <descriptorRefs> 
     <descriptorRef>jar-with-dependencies</descriptorRef> 
     </descriptorRefs> 
     <archive> 
     <manifest> 
      <mainClass>com.test.main</mainClass> // main being main.java which has my main method 
     </manifest> 
     </archive> 
    </configuration> 
    <executions> 
     <execution> 
     <id>make-assembly</id> <!-- this is used for inheritance merges --> 
     <phase>package</phase> <!-- bind to the packaging phase --> 
     <goals> 
      <goal>single</goal> 
     </goals> 
     </execution> 
    </executions> 
    </plugin> 

<sourceDirectory>src</sourceDirectory> 
    <resources> 
     <resource> 
     <directory>src</directory> 
     <excludes> 
      <exclude>**/*.java</exclude> 
     </excludes> 
     </resource> 
    </resources> 
+0

我已经改变了它,但仍然得到了相同的错误 – ilovejavaAJ

+0

您正在使用哪种IDE? – peaceUser

+0

我不使用IDE我只是使用texteditor(gedit)来编码和终端来运行程序。 – ilovejavaAJ

0

或作为https://mvnrepository.com/artifact/commons-io/commons-io/2.4

<dependency> 
    <groupId>commons-io</groupId> 
    <artifactId>commons-io</artifactId> 
    <version>2.4</version> 
</dependency> 
+0

我已经改变了它,但仍然得到了相同的错误 – ilovejavaAJ

+0

执行'mvn dependency:tree'来查看这个commons-io jar是否列在那里。如果没有,我怀疑jar被安装在一些其他的仓库位置。你可以检查这个帖子,看看如何检查你的本地仓库位置http://stackoverflow.com/questions/38382889/include-local-jar-file-in-maven-project-not-finding-文件/ 38398701#38398701或者您也可以从命令行本身而不是IDE执行您的maven命令,因为IDE使用嵌入式'Maven'并且存储库位置不同。 –

+0

我没有使用IDE我只是使用texteditor来编码和终端来运行代码 – ilovejavaAJ

0

给我不使用我只是用文本编辑IDE(gedit中)到代码和终端来运行程序。

在这种情况下,你将需要添加的JAR文件为所有依赖于运行类路径的;例如

$ java -classpath target/maven-1.0-SNAPSHOT.jar:path-to-commons-io-jar:... \ 
     com.sample.exercise.Main args 

当您在理解Maven的IDE中构建/运行时,它会自动将依赖关系添加到运行时JAR中。当你从命令提示符运行时,你需要自己处理这个问题......或者写一个简单的包装脚本来做到这一点。 (或创建一个包含所有依赖关系的“uberJAR”...)

+0

仍然得到了同样的错误我做了你所告诉的 – ilovejavaAJ

+0

java -classpath target/mavenOne-1.0-SNAPSHOT.jar:path-to-commons -io-jar:... \ com.sample.exercise.Main args – ilovejavaAJ

+0

因此,将“path-to-commons-io-jar”更改为REAL路径。 (咄!) –