2015-04-23 10 views
5

Mam plik app.properties w moim projekcie maven pod resources folderze jak pokazano tutaj (uproszczony):.properties ładunek z IDE, a także spoza JAR

 
myApp 
    |----src 
    |  | 
    |  |--main 
    |   |--java 
    |   | |--ApplicationInitializer.java 
    |   | 
    |   |--resources 
    |    |--app.properties 
    | 
    |---target 
     |--myApp.jar 
     |--app.properties  

W ApplicationInitializer klasy I chcesz załadować właściwości z plik app.properties z poniższego fragmentu kodu:

Properties props = new Properties(); 

String path = "/app.properties"; 

try { 
    props.load(ApplicationInitializer.class.getResourceAsStream(path)); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

System.out.println(props.getProperty("property")); 

Ten kawałek kod ładuje właściwości poprawnie, gdy uruchomię go od wewnątrz mojego IDE, ale nie z wyjątkiem

Exception in thread "main" java.lang.NullPointerException 
    at java.util.Properties$LineReader.readLine(Properties.java:434) 
    at java.util.Properties.load0(Properties.java:353) 
    at java.util.Properties.load(Properties.java:341) 
    at cz.muni.fi.fits.ApplicationInitializer.main(ApplicationInitializer.java:18) 

podczas próby uruchomienia jako plik JAR.

Do tworzenia pliku jar używam kombinacji maven-shade-plugin, maven-jar-plugin (za wyjątkiem właściwości pliku poza JAR) i maven-resources-plugin (do kopiowania właściwości pliku do określonego folderu) w pom.xml pliku jak pokazano tutaj :

<plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-shade-plugin</artifactId> 
     <version>2.3</version> 
     <executions> 
      <execution> 
       <phase>package</phase> 
       <goals> 
        <goal>shade</goal> 
       </goals> 
       <configuration> 
        <transformers> 
         <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> 
          <mainClass>cz.muni.fi.fits.ApplicationInitializer</mainClass> 
         </transformer> 
        </transformers> 
       </configuration> 
      </execution> 
     </executions> 
    </plugin> 

    <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-jar-plugin</artifactId> 
     <version>2.5</version> 
     <configuration> 
      <excludes> 
       <exclude>**/*.properties</exclude> 
      </excludes> 
     </configuration> 
    </plugin> 

    <plugin> 
     <artifactId>maven-resources-plugin</artifactId> 
     <version>2.7</version> 
     <executions> 
      <execution> 
       <id>copy-resource</id> 
       <phase>package</phase> 
       <goals> 
        <goal>copy-resources</goal> 
       </goals> 
       <configuration> 
        <outputDirectory>${basedir}/target</outputDirectory> 
        <resources> 
         <resource> 
          <directory>src/main/resources</directory> 
         </resource> 
        </resources> 
       </configuration> 
      </execution> 
     </executions> 
    </plugin> 

następnie włącza się kod w sposób głównego do tego:

Properties props = new Properties(); 

String path = "./app.properties"; 

try (FileInputStream file = new FileInputStream(path)) { 
    props.load(file); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

System.out.println(props.getProperty("property")); 

i udało się załadować właściwości z pliku podczas uruchamiania JAR, ale tym razem nie mogłem załadować ich podczas pracy w IDE, zakończyło się z tym samym wyjątkiem, co powyżej.

Moje pytanie brzmi: Jak ustawić plik w filepath (lub pom.xml?), Że będę mógł załadować właściwości uruchomione zarówno z pliku IDE, jak i JAR?

góry dzięki :)

+0

widzę w 'target' masz' myApp.jar' i 'app.properties'. Czy możesz sprawdzić, czy 'app.properties' znajduje się w pliku' .jar'? – Kuba

+0

Nie, nie jest, dlatego używam 'maven-jar-plugin', aby wykluczyć go ze słownika –

+0

Dlaczego próbujesz umieścić plik właściwości poza plikiem jar? Jeśli to zrobisz, nie możesz użyć 'getResourcesAsStream()'. – khmarbaise

Odpowiedz

0

sposób pracujemy w tej chwili ty zależą katalogu roboczym procesu Java. Zazwyczaj przy uruchamianiu aplikacji wskazuje to linia poleceń (zwana także powłoką).

W większości IDE można skonfigurować ten katalog w ustawieniach programu uruchamiającego. (Dla eclipse jest to na drugiej karcie "Argumenty") Więc będziesz musiał do katalogu docelowego (Dla eclipse jest przycisk "Workspace ...")

W szczególności w intelliJ można znaleźć to ustawienie w Run/Edit Konfiguracje ... Otworzy się okno: enter image description here Tam możesz edytować katalog roboczy. Po prostu dodajesz cel na końcu.

Edytuj: Właściwie dodałeś src/main/ressources na końcu.

+0

Więc jaka jest Twoja sugestia? Przykro mi, ale nie rozumiem twojej odpowiedzi. –

+0

Sugeruję, aby skonfigurować IDE, aby uruchomić proces java z właściwym katalogiem roboczym. Z jakiego IDE korzystasz? –

+0

Używam IntelliJ IDEA 14 –

0

W kodzie Java odczytać plik app.properties takiego:

final String ROOT_PATH = "custom.path"; // Or whatever you most like 
final String PROPERTIES_FILE = "app.properties"; 

// start :: try-catch here to manage I/O resources 
File directory = new File(System.getProperty(ROOT_PATH), "conf"); 
File file = new File(directory, PROPERTIES_FILE); 
BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(file)); 
// ... 
// end :: try-catch here to manage I/O resources 

Następnie trzeba sposobów ustawiania/deklarowania custom.path:

  • deklarując ją jako zmienną środowiskową
  • ustawienie go na run-time (właściwości środowiska) z -Dcustom.path=/somewhere/in/your/filesystem (Wolę ten, chyba że ścieżka jest stała i/lub współdzielona acr OSS różnych aplikacji)

Następnie, ostatecznie musisz skopiować/umieścić swój plik app.properties wewnątrz /somewhere/in/your/filesystem/conf. I dlaczego w środku /conf? Ponieważ używasz go, gdy zadeklarujesz pole directory. Jeśli nie chcesz go tam, po prostu go nie ustawiaj i usuń część , "conf".

Dodatkowo na uruchomienie go "lokalnie" (w IDE) użyj opcji ustawienie VM (IntelliJ IDEA):

enter image description here

+0

Dzięki, wygląda to obiecująco, ale jest zbyt przesadne, aby zdefiniować ścieżkę jako zmienną środowiskową, a także nie mogę użyć argumentu wykonawczego, ponieważ byłby on bałagan z moimi aktualnymi argumentami. –

+0

@Supermartzin Rozumiem część "zmienną środowiskową", ale argumenty środowiska wykonawczego (właściwości środowiska) mogą zawierać tyle, ile chcesz, i nie będą się wtrącać między siebie. –

+0

Oczywiście, masz rację, ale to osłabiłoby klarowność mojego programu i chcę to dostrzec. Dzięki i tak za radę. –

Powiązane problemy