2016-12-24 11 views
0

Когда я запустил main() от IntelliJ, я получил, как ожидается, peter,johnson как результат стандартного выхода. Но когда я запустил mvn clean package и попытаюсь выполнить java -jar target/example-1.0.0-SNAPSHOT-jar-with-dependencies.jar, я получаю следующее сообщение об ошибке. Почему и как я могу убедиться, что файл .properties читается?Файл свойств Java в jar не найден при запуске jar

java -jar target/example-1.0.0-SNAPSHOT-jar-with-dependencies.jar 
Exception in thread "main" java.io.FileNotFoundException:  file:/Users/ismar.slomic/src/ADOP/example/target/example-1.0.0-SNAPSHOT- jar-with-dependencies.jar!/my-example.properties (No such file or directory) 
at java.io.FileInputStream.open0(Native Method) 
at java.io.FileInputStream.open(FileInputStream.java:195) 
at java.io.FileInputStream.<init>(FileInputStream.java:138) 
at java.io.FileInputStream.<init>(FileInputStream.java:93) 
at com.example.MyPropertiesClass.getFullName(MyPropertiesClass.java:18) 
at com.example.MyMainClass.main(MyMainClass.java:9) 

MyMainClass

package com.example; 

import java.io.IOException; 

public class MyMainClass { 

    public static void main(String[] args) throws IOException { 
     MyPropertiesClass mpc = new MyPropertiesClass(); 
     System.out.println(mpc.getFullName()); 
    } 
} 

MyPropertiesClass

package com.example; 

import java.io.BufferedInputStream; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.util.Properties; 

public class MyPropertiesClass { 

    public String getFullName() throws IOException { 
    Properties properties = new Properties(); 
    ClassLoader cl = this.getClass().getClassLoader(); 
    String filePath = cl.getResource("my-example.properties").getFile(); 

    BufferedInputStream bis = new BufferedInputStream(new FileInputStream(filePath)); 
    properties.load(bis); 

    String name = properties.getProperty("name"); 
    String lastname = properties.getProperty("lastname"); 
    return name + "," + lastname; 
    } 
} 

my-example.properties

name=peter 
lastname=johnson 

pom.xml

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://maven.apache.org/POM/4.0.0" 
    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.example</groupId> 
<artifactId>example</artifactId> 
<version>1.0.0-SNAPSHOT</version> 

<name>${project.artifactId}</name> 
<description>My Example</description> 

<properties> 
    <maven.compiler.source>1.8</maven.compiler.source> 
    <maven.compiler.target>1.8</maven.compiler.target> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
</properties> 

<build> 
    <plugins> 
     <plugin> 
      <artifactId>maven-assembly-plugin</artifactId> 
      <version>3.0.0</version> 
      <configuration> 
       <descriptorRefs> 
        <descriptorRef>jar-with-dependencies</descriptorRef> 
       </descriptorRefs> 
       <archive> 
        <manifest> 
         <addClasspath>true</addClasspath> 
         <classpathPrefix>lib/</classpathPrefix> 
         <mainClass>com.example.MyMainClass</mainClass> 
        </manifest> 
       </archive> 
      </configuration> 
      <executions> 
       <execution> 
        <id>make-assembly</id> 
        <phase>package</phase> 
        <goals> 
         <goal>single</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
</build> 

ответ

2

Если файл свойств внутри кувшина, то вам лучше использовать getResourceAsStream вместо getResource и getFile.

Что-то вроде:

ClassLoader cl = this.getClass().getClassLoader(); 
    try (InputStream stream = cl.getResourceAsStream("my-example.properties")) { 
    properties.load(bis); 
    } 

getResource(String) Метод возвращает URL, который указывает на файл внутри баночки. В вашем случае что-то вроде: file:/Users/ismar.slomic/src/ADOP/example/target/example-1.0.0-SNAPSHOT-jar-with-dependencies.jar!/my-example.properties. Когда вы вызываете getFile по этому URL-адресу, он возвращает файл (т. Е. Банку), который не является указателем на файл свойств внутри.

Что может также работать, это открыть соединение по URL-адресу и использовать возвращенный JarURLConnection. Но с getResourceAsStream проще.

+0

Большое спасибо! Это сработало. Но не могли бы вы объяснить, почему 'getResourceAsStream' работал и' getResource' didn't? Они указывают на точно такой же путь к файлу, единственное различие заключается в том, как вы читаете файл, не так ли? –

+0

Ваш прием. Ответ отредактирован с подробностями. – YMomb

 Смежные вопросы

  • Нет связанных вопросов^_^