Jeśli używasz maven, zwykle umieszczasz log4j.properties w java lub w zasobach?

131

Gdzie należy umieścić plik log4j.properties w przypadku korzystania z konwencjonalnych katalogów Maven?

user496949
źródło
6
src / test / resources - konsument twojego artefaktu ustawiłby poziomy rejestrowania wymagane do wdrożenia. Poleciłbym jednak slf4j, jeśli robisz to do pracy komercyjnej. Daje to możliwość przełączania struktur rejestrowania podczas wdrażania. slf4j.org
David Victor,
2
BTW, jeśli chcesz po prostu poeksperymentować, możesz użyć log4j bez pliku konfiguracyjnego properties / xml. Z „ logging.apache.org/log4j/1.2/manual.html - Configuration” „Wywołanie metody BasicConfigurator.configure tworzy raczej prostą konfigurację log4j”. Zobacz także: logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/... maven.apache.org/plugins/maven-resources-plugin/examples/ ...
David Victor

Odpowiedzi:

143

src/main/resources jest do tego „standardowym rozmieszczeniem”.

Aktualizacja: powyższe odpowiedzi na pytanie, ale nie jest to najlepsze rozwiązanie. Sprawdź inne odpowiedzi i komentarze na ten temat ... prawdopodobnie nie wysyłałbyś własnych właściwości rejestrowania z jar, ale zamiast tego zostawiłbyś to klientowi (na przykład serwer aplikacji, środowisko sceny itp.), Aby skonfigurować żądane logowanie. Dlatego umieszczenie go src/test/resourcesjest moim preferowanym rozwiązaniem.

Uwaga: Mówiąc o opuszczeniu config dziennika beton do klienta / użytkownika, należy rozważyć zastąpienie log4jze slf4jw swojej aplikacji.

Jan Galiński
źródło
Nie udało mi się utworzyć katalogu zasobów. Czy muszę to robić ręcznie?
user496949
3
tak. Utwórz ręcznie resourcesiw log4j.propertiesfolderze wymienionym w odpowiedzi.
Nishant
@ user496949: pliki poniżej src/main/resourceszostaną domyślnie skopiowane dotarget/classes
splash
17
Chyba że zamierza eksportować swoje ustawienia LOG4J jako część artefaktu - jest znacznie lepiej umieścić ją pod src / test / zasobów
David Victor
1
@FerasOdeh, aby wykluczyć go z generowanych artefaktów (słoików, wojen itp.) I używać tylko podczas testowania, „Chyba że zamierzasz wyeksportować ustawienia log4j jako część artefaktu”.
Ali Shakiba,
61

Samo włożenie go src/main/resourcesspowoduje umieszczenie go w artefakcie. Np. Jeśli twoim artefaktem jest JAR, będziesz mieć log4j.propertiesplik w środku, tracąc początkowy punkt umożliwiający konfigurowanie logowania.

Zwykle umieszczam go src/main/resourcesi ustawiam jako wyjście do celu w następujący sposób:

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <targetPath>${project.build.directory}</targetPath>
            <includes>
                <include>log4j.properties</include>
            </includes>
        </resource>
    </resources>
</build>

Ponadto, aby program log4j faktycznie go widział, musisz dodać katalog wyjściowy do ścieżki klasy. Jeśli twój artefakt to wykonywalny plik JAR, prawdopodobnie użyłeś wtyczki maven-assembly-plugin do jego utworzenia. Wewnątrz tej wtyczki możesz dodać bieżący folder pliku JAR do ścieżki klasy, dodając Class-Pathwpis manifestu w następujący sposób:

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <configuration>
        <archive>
            <manifest>
                <mainClass>com.your-package.Main</mainClass>
            </manifest>
            <manifestEntries>
                <Class-Path>.</Class-Path>
            </manifestEntries>
        </archive>
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
    </configuration>
    <executions>
        <execution>
            <id>make-assembly</id> <!-- this is used for inheritance merges -->
            <phase>package</phase> <!-- bind to the packaging phase -->
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Teraz plik log4j.properties będzie znajdować się tuż obok pliku JAR i będzie można go niezależnie konfigurować.

Aby uruchomić aplikację bezpośrednio z Eclipse, dodaj resourceskatalog do ścieżki klas w konfiguracji uruchamiania: Run->Run Configurations...->Java Application->Newwybierz Classpathkartę, wybierz Advancedi przejdź do swojego src/resourceskatalogu.

Zoltán
źródło
2
Inną opcją może być umieszczenie go w src / test / resources, aby nie został dołączony.
rogerdpack
Łał. Dziękuję za to. Właśnie tego potrzebowałem!
blissfool
@ Zoltán, trudno mi dodać katalog wyjściowy do ścieżki klas, tak jak radziłeś. Czy istnieje sposób, w jaki mogę to zrobić ręcznie, na przykład przejść do pliku .classpath konkretnego projektu i dodać tam katalog wyjściowy log4j, aby log4j mógł zobaczyć plik .properties po dołączeniu aplikacji do pliku .war. Ponadto znacznik targetPath, czy wartość należy używać w takiej postaci, w jakiej jest, ${project.build.directory}czy też należy ją edytować zgodnie z rzeczywistą ścieżką, w której projekt znajduje się na moim dysku lokalnym?
Ireti
26

src/main/resourcesJest to typowe miejsce dla niektórych „eksploracji danych” .

Wyniki w Google Code Search :

  • src/main/resources/log4j.properties: 4877
  • src/main/java/log4j.properties: 215
pluśnięcie
źródło
4
w jaki sposób ta odpowiedź różni się pod jakimkolwiek względem od tej, na którą odpowiedziano 20 minut temu? Również, to resourcesnie resource, jeśli dobrze pamiętam.
Nishant
6
@ Nishant: nie jest inaczej, ponieważ kiedy otworzyłem skrzynkę odpowiedzi, wyszedłem z komputera. Po powrocie i udzieleniu odpowiedzi na pytanie przegapiłem, że na to pytanie już została udzielona odpowiedź. resourcebyła tylko literówką.
powitanie
1
Proponuję poczytać o maven, wtyczce kompilatora mavena, konwencjach dotyczących układu projektów maven. Może spójrz, co się dzieje pod „celem”, gdy tworzony jest twój artefakt. Wtedy może mógłbyś zmodyfikować swoją odpowiedź.
David Victor,
4
Prawidłowa odpowiedź to src / xxx / resources - to nie jest konwencja. Zobacz: maven.apache.org/plugins/maven-resources-plugin/examples/ ... - tutaj „xxx” może być „main” lub „test”. Jeśli nie chcesz zapewnić wstępnie skonfigurowanych poziomów rejestrowania, rozsądniej jest skonfigurować rejestrowanie zgodnie z wymaganiami testowania - za pośrednictwem „src / test / resources” - i pozwolić konsumentowi artefaktu na ustawienie poziomu rejestrowania.
David Victor,
22
Wyniki Google dla „Skocz z mostu”: 18.200.000. Wyniki Google dla „Nie skacz z mostu”: 137.000
djjeck
9

Zasoby używane do inicjalizacji projektu najlepiej umieścić w folderze src / main / resources . Aby umożliwić ładowanie tych zasobów podczas kompilacji, można po prostu dodać wpisy w pom.xml w projekcie maven jako zasób kompilacji

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering> 
        </resource>
    </resources>
</build> 

W tym folderze używanym do inicjalizacji można również przechowywać inne pliki .properties. Filtrowanie jest ustawione na prawdę, jeśli chcesz mieć kilka zmiennych w plikach właściwości folderu zasobów i zapełnić je z plików właściwości filtrów profilu, które są przechowywane w src / main / filter, który jest ustawiony jako profile, ale jest to zupełnie inny przypadek użycia . Na razie możesz je zignorować.

To świetne wtyczki zasobów do zarządzania zasobami , przydatne, po prostu przejrzyj też inne sekcje.

dewastator
źródło
Jeśli po prostu skopiujesz i wkleisz powyższy fragment Mavena, pamiętaj, że jest to </resources> </build>
rdesilva
6

Umieszczenie plików zasobów w innej lokalizacji nie jest najlepszym rozwiązaniem, z którego możesz skorzystać:

<build>
  <resources>
    <resource>
      <directory>src/main/java</directory>
      <excludes>
        <exclude>**/*.java</exclude>
      </excludes>
    </resource>
  </resources>
<build>

Na przykład, gdy pliki zasobów (np. Jaxb.properties) trafiają głęboko do pakietów wraz z klasami Java.

Ali Shakiba
źródło
1

Jeśli plik log4j.properties lub log4j.xml nie został znaleziony w src / main / resources, użyj tego PropertyConfigurator.configure ("log4j.xml");

   PropertyConfigurator.configure("log4j.xml");
   Logger logger = LoggerFactory.getLogger(MyClass.class);
   logger.error(message);
ethemsulan
źródło
0

Dodaj poniższy kod z tagów zasobów w swoim pom.xml wewnątrz tagów kompilacji. więc oznacza to, że tagi zasobów muszą znajdować się wewnątrz tagów build w twoim pom.xml

<build>
    <resources>
        <resource>
            <directory>src/main/java/resources</directory>
                <filtering>true</filtering> 
         </resource>
     </resources>
<build/>
Challa Purushotham
źródło