aplikacja web a pliki konfiguracyjne

0

Witam!
Mam niestety kolejny problem... Tworze aplikacje webowa ktora korzysta z plikow konfiguracyjnych... z tym ze sciezki dostepu do nich sa zdefiniowane w kodzie aplikacji jako np. "log4j.xml" .. normalnie sciezka taka wskazuje na katalog domowy projektu ale jak to jest po zdeployowaniu aplikacji? Pytam poniewaz mimo ze mam ten plik w katalogu projektu to serwer nie widzi go i wywala FileNotFoundException... Wiec gdzie powinny byc umieszczone te pliki przy takim zdefiniowaniu sciezki w kodzie? Korzystam z Java Server 9.. Pozdrawiam

0

Generalnie po zbudowaniu wara czy jara w przypadku zwykłej aplikacji, to w jego środku powinny znajdować się te pliki jeżeli umieściłeś je w strukturze projektu. A dobierać powinieneś się do nich nie poprzez np new FileInputStream(absolutna_sciezka_do_pliku) bo wtedy jak to już pewnie zauważyłeś po zdeployowaniu nie działa tylko poprzez sięganie do zasobów aplikacji dla aplikacji webowych można to zrobić np. tak:

getServletContext().getResourceAsStream("/WEB-INF/web.xml")

powinno się to robić w servlecie lub gdzieś gdzie możesz sie do tego servlet contextu dostać. Jak argument metody podajesz ścieżkę do pliku w warze (patrzy przykład powyżej)

0

a ta metoda getServletContext() z jakiej klasy pochodzi??
I jak to zastosowac np w przyapdku w ktorym mam...

      OutputStream  os = new FileOutputStream(f);

to co zamiast tego napisac?

0

Właśnie tak

InputStream is = getServletContext().getResourceAsStream("/WEB-INF/web.xml");

Metoda znajduje się w klasie HttpServlet. I chyba chodzi Ci o InputStream a nie output, chcesz zapisywać czy odczytywać? To drugie miało by mały sens a i nie wiem czy jest możliwe chociaż impossible is nothing

0

Po przemyśleniu sytuacji stwierdzam ze możliwe że się źle zrozumieliśmy... Dokładnie chodzi mi o coś takiego (postaram się wytlumaczyc mozliwe najbardziej klarowni).
Mam duza aplikacje (autmatyzacja testow)... Aplikacja ta dziala w oparicu o pluginy tzn kazdy plugin jest w zapakowany w *.jar i z zalozenia powinien byc rozpakowywany w odpowiednie miejsce i stamtad rozpakowane klasy odpowiednio wczytywac classloader... poza tym do konfiguracji systemu uzywamy plikow .properites i pliku log4j.xml do konfiguracji loggera aplikacji. Pliki properties powinny być zarowno zapisywane jak i odczytywane... Gdy uruchamialismy to spod prostej konsoli (startowanej z main()) na komputerze lokalnym wszystko dzialalo poniewaz aplikacja zczytywala dane z plikow w odpowienich sciezkach na dysku... Docelowo jednak aplikacja powinna komunikowac sie z warstwa prezentacji umieszczona na zdalnym hoscie przy uzyciu webservices.. i tu pojawia sie problem poniewaz teraz gdy mamy cala aplikacje i webservice umieszczona w netbeans w projekcie web to po zdeplowywaniu nie widzi ona plikow na dysku (smiem przypuszczac ze tak jak powiedzial przedmowca nie wychodzi ona poza zawartosc pliku *.war w ktorym sie znajduje). Jak nalezy zrobic aby aplikacja spelniala podane zalozenia i mogla korzystac z webservices i udostepniac swoje metody dla zdalnej prezentacji?? mam nadzieje ze to w ogóle mozliwe jest.. a moze ten projekt nalezy tworzyc jakos inacze? Kazda aplikaca typu web zdeployowana na jakims serwerze (np JBoss) korzysta tylko z wlasnego archiwum natomiast nie ma mozliwosci odczytu z dysku?? Pozdrawiam i prosze o szybka odpowiedz
Rafal

0

Dalej troche nie rozumiem ale... Czyli rozumiem, że te pliki z założenia nie powinny znajdować się w warze? Czyli w takim wypadku gdzie? Gdziekolwiek na dysku czy w ktorymś z modułów (archiwów jar)? Jeżeli gdzie kolwiek na dysku nie rozumiem czemu nie działa. Piszesz, że webservice będzie na innym hoście, ok, i to z niego chcesz sie dobierać do plików konfiguracyjnych, które znajdują się na innym komputerze? Tak to zrozumiałem.

0

no to zle zrozumiales... webservice bedzie sie znajdowac tam gdzie aplikacja... warstwa prezentacji korzystajaca z webservice bedzie sie znajdowac na innym hoscie.. i tak: w jar znajduja sie pliki *.class plugina a pliki konfiguracyjne gdziekolwiek indziej na dysku...

0

No to powinno to działać, co dokładnie logi serwera wypluwaja? Jest jeszcze taka opcja, że server (tomcat czy co tam używacie) nie pozwala otworzyć tego pliku na dysku ze względów bezpieczeństwa ale wtedy będzie jasny komunikat w logach i wystarczy pozmieniać ustawienia, i to by się zgadzało nawet bo napisałeś że jak samego jarka odpalałeś pod konsolą to śmigało a przez aplikację nie, ja miałem taki problem gdy server stał na Debianie, na Windowsie się nie spotkałem. Więcej już chyba nie pomogę. Powodzenia. Pozdr

0

no wlasnie ja mam ten problem w windows... a serwer wywala FileNotFoundException...

0

no bo jak powinna wygladac deklaracja strumienia ktory mialby czytac np plik.txt ?? nie wiem moze po prostu nie znam javy :(

0

wklej kod to zerkne

0

prosze:


package kernel;
import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.OutputStream;
import java.net.URL;

import kernel.*;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import org.apache.log4j.xml.DOMConfigurator;

public class Config {
//Plik z konfiguracją
private static final org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(Config.class);
private static File f;
//przyszły obiekt Properties
private static Properties properties = new Properties();
public static String path=null;
public static String updateTime="36000";
public static String logfile=null;
// private static Logger log=new Logger();

public static void setFile(String path) {
    DOMConfigurator.configure(ManagerHandler.log4jpath);
    f = new File(path);
}

public static void configure() {
    DOMConfigurator.configure(ManagerHandler.log4jpath);
    System.setProperty("file.encoding", "UTF-8");
    Config pt = new Config();
    pt.loadProperties();
    path=pt.properties.getProperty("pathPlugin");
    updateTime=pt.properties.getProperty("updateTime");
   
    
}
private static void loadProperties(){
   
    DOMConfigurator.configure(ManagerHandler.log4jpath);
    
    //Strumień wejściowy
  
   
    InputStream is;
    try {
        System.out.println(f);
        is = new FileInputStream(f);
        //ładujemy nasze ustawienia
        properties.load(is);
    } catch (FileNotFoundException e) {
   //     log.addException(e.getStackTrace(), e.getMessage());
     //   log.addEvent("Configuration file not found");
        logger.error(" Configuration file not found", e);
    } catch (IOException e) {
       // log.addException(e.getStackTrace(), e.getMessage());
        //log.addEvent("Cannot read configuration file");
        logger.error(" Cannot read configuration file", e);
    } catch (Exception e) {
        logger.error(e);
       // log.addEvent("An error occured... For detailed information please see logfile");
    }
    
}

public static void saveProperties(String key, String value){
    DOMConfigurator.configure(ManagerHandler.log4jpath);
    OutputStream os;
    try {
        os = new FileOutputStream(f);
        properties.setProperty(key, value);
        properties.store(os, null);
    } catch (FileNotFoundException e) {
      //  log.addException(e.getStackTrace(), e.getMessage());
      //  log.addEvent("Configuration file not found");
        logger.error(" Configuration file not found",e);
    } catch (IOException e) {
      //  log.addException(e.getStackTrace(), e.getMessage());
      //  log.addEvent("Configuration file is read-only");
        logger.error(" Configuration file is read-only", e);
    } catch (Exception e) {
        logger.error(e);
      //  log.addEvent("An error occured... For detailed information please see logfile");
    }
    
}

}

0

to wklej jeszcze stacktrace z logów serwera jak się wywali wyjątek

0

dzieki za pomoc... problem zostal juz rozwiazany...

1 użytkowników online, w tym zalogowanych: 0, gości: 1