2017-09-26 138 views
0

我在Eclipse中有简单的maven项目。该应用程序包含文件:src/main/resources/test.txt。我想读取该文件并将其写入输出中。它在Eclipse中工作,但在创建jar文件后不能从命令行中运行。如何配置项目以两种方式工作。 我错在哪里? 不正确的jar文件,java代码,清单,maven配置?通过maven创建jar来从同一个jar文件读取资源文本文件

应用程序结构:

Application structure

运行:

java -jar fileRead-0.0.1-SNAPSHOT.jar 

错误:

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/io/IOUtils 
    at fileRead.FileRead.main(FileRead.java:11) 
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) 
     ... 1 more 

Java代码:

package fileRead; 
import java.io.IOException; 

import org.apache.commons.io.IOUtils; 

public class FileRead { 
    public static void main(String[] args) { 
    String file = null; 
    try { 
     file = IOUtils.toString((new FileRead()).getClass().getClassLoader().getResourceAsStream("test.txt")); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    System.out.println(file); 
    } 
} 

的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>com.fileRead</groupId> 
<artifactId>fileRead</artifactId> 
<version>0.0.1-SNAPSHOT</version> 
<packaging>jar</packaging> 
<name>fileRead</name> 
<url>http://maven.apache.org</url> 
<properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    <maven.compiler.target>1.8</maven.compiler.target> 
    <maven.compiler.source>1.8</maven.compiler.source> 
</properties> 
<dependencies> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>4.12</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.directory.studio</groupId> 
     <artifactId>org.apache.commons.io</artifactId> 
     <version>2.4</version> 
    </dependency> 
</dependencies> 
<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-jar-plugin</artifactId> 
      <version>3.0.2</version> 
      <configuration> 
       <archive> 
        <manifest> 
         <addClasspath>true</addClasspath> 
         <mainClass>fileRead.FileRead</mainClass> 
        </manifest> 
       </archive> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 

FILEREAD-0.0.1-SNAPSHOT.jar:

fileRead 
    FileRead.class 
META-INF 
    maven 
    MANIFEST.MF 
    test.txt 

MANIFEST.MF:

Manifest-Version: 1.0 
Built-By: msmorenda 
Class-Path: org.apache.commons.io-2.4.jar commons-io-2.4.jar 
Created-By: Apache Maven 3.5.0 
Build-Jdk: 1.8.0_121 
Main-Class: fileRead.FileRead 

的test.txt:

abc 
def 
ghi 
+0

你为什么要编译jar而不是java类?我认为maven有一个特定的结构,当你创建jar文件时,没有名为“resources”或“main/java”的目录,所以我没有找到它 –

+0

当你说“它在Eclipse中工作时,但在创建jar文件后不能从命令行得到“ - 你的意思是它可以在Eclipse中工作,但是当你在服务器上运行JAR文件时,Tomcat或类似的东西时不会运行? – SHG

+0

我在Windows上没有服务器只是命令行。 – maly174

回答

0

的问题是,MANIFEST.MF指向所需的依赖关系。但是依赖关系与生成的jar文件不在同一个目录中。要复制所需的库(公共-IO),你需要另一个插件添加到您的pom如下:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-dependency-plugin</artifactId> 
    <executions> 
     <execution> 
      <id>copy-dependencies</id> 
      <phase>prepare-package</phase> 
      <goals> 
       <goal>copy-dependencies</goal> 
      </goals> 
      <configuration> 
       <outputDirectory>${project.build.directory}/lib</outputDirectory> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-jar-plugin</artifactId> 
    <version>3.0.2</version> 
    <configuration> 
     <archive> 
      <manifest> 
       <classpathPrefix>lib</classpathPrefix> 
       <addClasspath>true</addClasspath> 
       <mainClass>fileread.FileRead</mainClass> 
      </manifest> 
     </archive> 
    </configuration> 
</plugin> 

maven-dependency-plugin具有上述配置将在lib目录复制target下所需的库。现在,如果您将target目录设置为当前目录,并致电java -jar <name_of_jar>,那么所有内容都应该有效。

注意:如果您想将您的jar文件移动到另一个位置,您应该将其与lib目录一起打包。并且请注意,我将您班级的包名改为fileread而不是fileRead。原因? Java约定。

-1

可以用行家它包含你需要的库创建的组件,然后使用“MVN包”来创建它

的pom.xml

<build> 
    <plugins> 
     <plugin> 
      <artifactId>maven-assembly-plugin</artifactId> 
      <version>2.6</version> 
      <configuration> 
       <descriptors> 
        <descriptor>src/assemblies/bin-with-dependencies.xml</descriptor> 
       </descriptors> 
       <tarLongFileMode>gnu</tarLongFileMode> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 

SRC /组件/滨与 - dependencies.xml

<assembly> 
    <id>bin-with-dependencies</id> 
    <formats> 
     <format>jar</format> 
    </formats> 
    <includeBaseDirectory>false</includeBaseDirectory> 
    <dependencySets> 
     <dependencySet> 
      <outputDirectory></outputDirectory> 
      <unpack>false</unpack> 
      <scope>compile</scope> 
     </dependencySet> 
     <dependencySet> 
      <unpack>false</unpack> 
      <scope>runtime</scope> 
      <useProjectArtifact>true</useProjectArtifact> 
     </dependencySet> 
    </dependencySets> 
</assembly> 

这将创建并包含与您的JAR文件夹归档和它的所有库 ,然后运行它像

java命令{directory_jars}/* fileread.FileRead ...

“/ *” 可能仅适用于Windows