2010-03-26 22 views
7

Hiii ... Chcę pobrać zawartość pliku właściwości do obiektu klasy InputStream za pomocą metody getSystemResourceAsStream(). Zbudowałem przykładowy kod. Działa to dobrze przy użyciu metody main(), ale gdy wdrażam projekt i uruchamiam go na serwerze, ścieżka pliku właściwości nie może zostać uzyskana ... tak więc wartość obiektu magazynu typu inputstream ma wartość null.getSystemResourceAsStream() zwraca wartość null

Przykładowy kod jest tutaj ..

public class ReadPropertyFromFile { 

    public static Logger logger = Logger.getLogger(ReadPropertyFromFile.class); 

    public static String readProperty(String fileName, String propertyName) { 
     String value = null; 
     try { 
      //fileName = "api.properties"; 
      //propertyName = "api_loginid"; 

      System.out.println("11111111...In the read proprty file....."); 


      // ClassLoader loader = ClassLoader.getSystemClassLoader(); 

      InputStream inStream = ClassLoader.getSystemResourceAsStream(fileName); 

      System.out.println("In the read proprty file....."); 
      System.out.println("File Name :" + fileName); 
      System.out.println("instream = "+inStream); 

      Properties prop = new Properties(); 

      try { 
       prop.load(inStream); 
       value = prop.getProperty(propertyName); 
      } catch (Exception e) { 
       logger.warn("Error occured while reading property " + propertyName + " = ", e); 
       return null; 
      } 
     } catch (Exception e) { 
      System.out.println("Exception = " + e); 
     } 
     return value; 
    } 

    public static void main(String args[]) { 

     System.out.println("prop value = " + ReadPropertyFromFile.readProperty("api.properties", "api_loginid")); 
    } 
} 
+2

Dlaczego używasz programu ładującego klasy, a nie normalnego? – skaffman

Odpowiedz

1

Spróbuj użyć getResourceAsStream() zamiast 'getSystemResourceAsStream()'.

6

Urządzenie ładuje zasoby z java.class.path map z mapą do zmiennej systemowej CLASSPATH. W twojej lokalnej aplikacji prawdopodobnie masz zasób, który próbujesz załadować, skonfigurowany w zmiennej java.class.path. Na serwerze jest to kolejna historia, ponieważ prawdopodobnie serwer ładuje zasoby z innego programu ładującego klasy.

Spróbuj użyć ClassLoader że załadowany klasę używając poprawnej ścieżki:

getClass().getResourceAsStream(fileName); 

Ten article może również być przydatne.

+0

getClass(). GetResourceAsStream ("input.properties"); pracował dla mnie. zasób znajduje się w tym samym katalogu klasy, która go używa –

15

wdrożyć projekt i uruchomić na serwerze,

To brzmi jak JSP/Servlet webapplication. W takim wypadku trzeba użyć ClassLoader który otrzymuje się w następujący sposób:

ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 

Ten ma dostęp do wszystkichścieżek ścieżki klasy przywiązane do webapplication w pytaniu i nie jesteś już uzależniony od którego rodzic classloader (aplikacja internetowa ma więcej niż jeden!) załadowała twoją klasę.

Następnie na tym programie ładującym klasy należy po prostu zadzwonić pod numer getResourceAsStream(), aby uzyskać strumień klasy clas jako strumień, a nie getSystemResourceAsStream(), który zależy od sposobu uruchomienia aplikacji internetowej. Nie chcesz być zależny na tym jak dobrze, ponieważ nie masz nad nim kontroli na zewnętrznych hosting:

InputStream input = classLoader.getResourceAsStream("filename.extension"); 

To jest wreszcie bardziej wytrzymałe niż początkowej getSystemResourceAsStream() podejścia i Class#getResourceAsStream() sugerowane przez innych.

Powiązane problemy