Dodaj plik właściwości do ścieżki klas IntelliJ

122

Uruchamiam prosty program Java z IntelliJ IDE przy użyciu menu Run-> Run. To działa dobrze. Teraz chcę dodać logowanie log4j.

Dodałem folder zasobów w katalogu głównym projektu. Dodałem plik log4j.properties w tym folderze. Zmieniłem kod, żeby coś zarejestrować.

Jaki jest właściwy sposób poinformowania IntelliJ o dołączeniu folderu zasobów do ścieżki klas, aby plik właściwości był widoczny?

Z IntelliJ 8 mogłem odgadnąć rolę pijanej małpy i ostatecznie doprowadzić to do pracy. Mam teraz 9 i całkowicie mi się nie udało. Próbowałem przez godzinę. A może gdzieś opcja „Dodaj do ścieżki klas”? / fume / vent / rant

Tony Ennis
źródło
Ok, sytuacja jest rozwiązana. To jest nowa instalacja IntelliJ - log4J NIE jest dołączony domyślnie. W moim kodzie zaimportowałem rejestrator zapasów, a nie log4j. Rejestrator zapasów obsługuje podobne metody, więc nie było oczywiste, że używam niewłaściwego rejestratora! Nic dziwnego, że nie czytałem pliku właściwości log4j ani nie raportowałem, czego potrzebowałem, aby skonfigurować log4j. Co za kopnięcie w zęby!
Tony Ennis
Znalazłem dobry opis dla początkujących do logowania4j tuttlem.github.io/2015/02/08/start-logging-with-log4j2.html
Rahal Kanishka

Odpowiedzi:

91

Spróbuj tego:

  • Przejdź do struktury projektu.
  • Wybierz swój moduł.
  • Znajdź folder w drzewie po prawej stronie i wybierz go.
  • Kliknij przycisk Źródła nad tym drzewem (z niebieskim folderem), aby uczynić ten folder folderem źródłowym.
ColinD
źródło
Zrobiłem to około 50 razy, po prostu zrobiłem to ponownie. Mój wynik nie zmienia się, mimo że zmieniłem wzorzec konwersji układu na coś, co byłoby oczywiste. Zastanawiam się, czy w mojej ścieżce klas znajduje się inny plik log4j.properties.
Tony Ennis
29
Sprawdź wzorce zasobów w ustawieniach kompilatora. Sprawdź, czy jest tam „? *. Properties”. Jest tam domyślnie, ale to jedyna inna rzecz, o której przychodzi mi do głowy.
ColinD,
3
Alternatywą dla Sourcesbutton - kliknij prawym cokolwiek katalog Zabawie stworzony i wybierz "Mark Directory jako": "Źródło root"
mschr
10
Zwróć uwagę, że jeśli utworzyłeś projekt z Maven POM, zamiast struktury źródłowej ad hoc, to rozwiązanie nie zadziała. Zamiast tego musisz dodać ten katalog jako zasób do POM. Zobacz odpowiedź Petera Thygesena.
lreeder
Można to również zrobić programowo za pomocą PropertyConfigurator.configure ("../ conf / log4j.properties")
Jason D
47

Właściwie masz co najmniej 2 sposoby na zrobienie tego, pierwszy sposób jest opisany przez ColinD, po prostu skonfiguruj folder „resources” jako folder Sources w IDEA. Jeśli Wzory zasobów zawiera rozszerzenie zasobu, to zostaną skopiowane do katalogu wyjściowego po Bądź projekt i katalog wyjściowy jest automatycznie ścieżki klasy aplikacji.

Innym popularnym sposobem jest bezpośrednie dodanie folderu zasobów do ścieżki klas. Przejdź do struktury projektu | Moduły | Twój moduł | Zależności , kliknij Dodaj , Biblioteka modułów z pojedynczym wejściem , określ ścieżkę do folderu „zasoby”.

Jeszcze innym rozwiązaniem byłoby umieszczenie pliku log4j.properties bezpośrednio w katalogu źródłowym projektu (w domyślnym katalogu pakietu). Jest taki sam jak pierwszy, z tym wyjątkiem, że nie trzeba dodawać kolejnego źródła źródłowego w ustawieniach ścieżek modułu , plik zostanie skopiowany do katalogu wyjściowego w programie Make.

Jeśli chcesz przetestować z różnymi konfiguracjami log4j, może być łatwiej określić niestandardowy plik konfiguracji bezpośrednio w konfiguracji Uruchom / Debuguj , parametry maszyny wirtualnej zapisane w następujący sposób:

-Dlog4j.configuration=file:/c:/log4j.properties.

CrazyCoder
źródło
Wykonałem twoje akapity 2 i 3 bez skutku. Jestem pewien, że sugestie działają , po prostu nie przyniosły efektu - zachowuje się tak, jakby w ścieżce klas znajdował się inny plik log4j.properties. Ale nigdzie tego nie widzę. Jeśli całkowicie usunę plik właściwości log4j, nie pojawi się w konsoli ostrzeżenie „musisz skonfigurować log4j”. Po raz pierwszy korzystam z darmowego IntelliJ (i wersji 9.x), więc może ma to coś wspólnego.
Tony Ennis
1
Użycie jawnego parametru -D VM również nie miało żadnego efektu. W tym momencie mogę się tylko domyślać, że spadłem ze szczytu „głupiego drzewa” i uderzyłem w każdą gałąź schodząc w dół! Myślę, że poszukam w JetBrains i zapytam ...
Tony Ennis
Czy mógłbyś przesłać przykładowy projekt z dokładnymi krokami w celu odtworzenia problemu na adres [email protected]?
CrazyCoder,
Przekazywałem -Dlog4j.configuration = plik: / c: /log4j.properties w argumentach programu. Parametry VM załatwiały mi sprawę.
Ajak6
42

Mam ten sam problem i strasznie mnie to irytuje !!

Zawsze myślałem, że powinienem zrobić odpowiedź 2. To kiedyś działało w Intellij 9 (teraz używa 10).

Jednak doszedłem do wniosku, że dodanie tej linii do mojego pliku pom Maven pomaga:

<build>
  ...
  <resources>
    <resource>
      <directory>src/main/resources</directory>
    </resource>
  </resources>
  ...
</build>
Peter Thygesen
źródło
To był dokładnie problem, który miałem, teraz pliki zasobów są pomyślnie kopiowane do folderu wyjściowego.
artjomka
Ta odpowiedź naprawdę działa. Zrobiłem to, co sugerował ColinD w swoich komentarzach. Dziękuję Ci.
Dziękuję, to jedyne rozwiązanie, które mi się sprawdziło.
Minh Thiện
18

Spędziłem sporo czasu zastanawiając się, jak to zrobić w Intellij 13x. Najwyraźniej nigdy nie dodałem plików właściwości do artefaktów, które ich wymagały, co jest oddzielnym krokiem w Intellij. Poniższa konfiguracja działa również, gdy masz plik właściwości, który jest współużytkowany przez wiele modułów.

  • Przejdź do konfiguracji projektu (CTRL + ALT + SHIFT + S)
  • Z listy wybierz moduł, do którego chcesz dodać jeden lub więcej plików właściwości.
  • Po prawej stronie wybierz kartę Zależności.
  • Kliknij zielony plus i wybierz „Jars or directories”.
  • Teraz wybierz folder zawierający pliki właściwości. (Nie próbowałem dołączać pojedynczego pliku)
  • Intellij zapyta teraz, jaka jest „kategoria” wybranego pliku. Wybierz „klasy” (nawet jeśli nie są).
  • Teraz musisz dodać pliki właściwości do artefaktu. Intellij da ci skrót pokazany poniżej. Pokaże błędy w czerwonej części na dole i 'czerwoną żarówkę', która po kliknięciu pokazuje opcję dodania plików do artefaktu. Możesz także przejść do sekcji „artefakty” i ręcznie dodać pliki do artefaktów.

wprowadź opis obrazu tutaj

Julius
źródło
14

Podobnym wyzwaniem było dodanie plików z rozszerzeniami .ini do ścieżki klas. Znalazłem tę odpowiedź , czyli dodać ją do Preferencje -> Kompilator -> Wzorce zasobów -> [...]; *. Ini

prototyp
źródło
1
to był dokładnie ten problem, który miałem z plikami .conf
James
Pomyślałem, co do cholery jest nie tak z moim kodem? Dzięki za to rozwiązanie
Shoaib Chikate,
5

Jeśli kiedykolwiek napotkasz ten sam problem ze Scalą i SBT:

  • Przejdź do struktury projektu. Skrót to (CTRL + ALT + SHIFT + S)

  • Na liście po lewej stronie wybierz Ustawienia projektu> Moduły

  • Na liście modułów po prawej stronie wybierz moduł o nazwie projektu (bez kompilacji) i wybierz zakładkę źródła

  • W środku rozwiń folder, który jest dla mnie głównym katalogiem twojego projektu /home/<username>/IdeaProjects/<projectName>

  • Spójrz na sekcję Content Root po prawej stronie, czerwone ścieżki to katalogi, których nie utworzyłeś. Będziesz chciał umieścić plik właściwości w katalogu zasobów. Utworzyłem więc src/main/resourcesi umieściłem w nim log4j.properties. Uważam, że możesz również zmodyfikować główny katalog zawartości, aby umieścić go w dowolnym miejscu (nie zrobiłem tego).

  • Uruchomiłem kod z konfiguracją SBT i znalazłem mój plik log4j.properties.

wprowadź opis obrazu tutaj

user2361174
źródło
2

Dla tych z Was, którzy dokonują migracji z Eclipse do IntelliJ lub odwrotnie, tutaj jest wskazówka dotycząca pracy z plikami właściwości lub innymi plikami zasobów.

To irytujące (kosztowało mnie cały wieczór, żeby się dowiedzieć), ale oba IDE działają zupełnie inaczej, jeśli chodzi o wyszukiwanie plików zasobów / właściwości, gdy chcesz uruchomić lokalnie ze swojego IDE lub podczas debugowania. (Pakowanie do pliku .jar jest również zupełnie inne, ale to lepiej udokumentowane).

Załóżmy, że w kodzie znajduje się odwołanie do ścieżki względnej, takie jak to:

new FileInputStream("xxxx.properties");

(co jest wygodne, jeśli pracujesz z plikami .properties specyficznymi dla środowiska, których nie chcesz pakować razem z plikiem JAR)

INTELLIJ

(Używam 13.1, ale może być ważny dla większej liczby wersji)

Plik xxxx.properties musi znajdować się w katalogu PARENT ROOT projektu, aby można go było pobrać w czasie wykonywania w IntelliJ. (ROOT projektu to miejsce, w którym znajduje się folder / src)

ZAĆMIENIE

Eclipse jest po prostu szczęśliwy, gdy plik xxxx.properties znajduje się w samym katalogu ROOT projektu.

Więc IntelliJ spodziewa się, że plik .properties będzie o 1 poziom wyższy niż Eclipse, gdy tak się do niego odwołuje !!

Ma to również wpływ na sposób wykonywania kodu, gdy masz tę samą linię kodu (nowy FileInputStream ("xxxx.properties");) w wyeksportowanym pliku .jar. Jeśli chcesz być zwinny i nie chcesz spakować pliku .properties ze swoim jar, musisz wykonać jar jak poniżej, aby poprawnie odwołać się do pliku .properties z wiersza poleceń:

EKSPORTOWANY SŁOIK INTELLIJ

java -cp "/path/to_properties_file/:/path/to_jar/some.jar" com.bla.blabla.ClassContainingMainMethod

EKSPORTOWANY SŁOIK ECLIPSE

java -jar some.jar

gdzie wyeksportowany plik jar wykonywalny Eclipse będzie po prostu oczekiwał, że przywoływany plik .properties będzie w tym samym miejscu, w którym znajduje się plik .jar

DataHacker
źródło
Tak, logging.properties, w przeciwieństwie do log4j2.xml lub log4j.properties, musi znajdować się w katalogu głównym modułu IntelliJ. Również w przeciwieństwie do Log4j, który po prostu działa, odkryłem, że nadal muszę łączyć się z ławą przysięgłych, aby uruchomić wewnątrz IntelliJ (Eclipse to ta sama historia, to wina logowania Java), patrz stackoverflow.com/questions/960099/… . Jedną z alternatyw byłoby naprawienie konfiguracji uruchamiania / debugowania za pomocą -Djava.util.logging.config.file =, co uważam za raczej niewygodne, ponieważ wolałbym mieć konfigurację w kodzie lub w oczekiwanym pliku właściwości.
Russ Bateman
1

Być może jest to trochę nie na temat, biorąc pod uwagę, że odpowiedź na to pytanie została już udzielona, ​​ale miałem podobny problem. W moim przypadku tylko niektóre zasoby testów jednostkowych zostały skopiowane do folderu wyjściowego podczas kompilacji. Mój persistence.xml w folderze META-INF został skopiowany, ale nic więcej .

Ostatecznie „rozwiązałem” problem, zmieniając nazwy problematycznych plików, przebudowując projekt, a następnie zmieniając nazwy plików z powrotem na oryginalne. Nie pytaj mnie, dlaczego to zadziałało, ale zadziałało. Moje przypuszczenie jest takie, że w jakiś sposób mój projekt IntelliJ stracił synchronizację z systemem plików i operacja zmiany nazwy wyzwoliła jakieś wewnętrzne „ponowne skanowanie zasobów”.

user1426162
źródło
1

To jeden z głupich błędów, które popełniłem. Spędziłem dużo czasu próbując rozwiązać ten problem i wypróbowałem wszystkie odpowiedzi zamieszczone powyżej, ale ostatecznie był to jeden z wielu moich głupich błędów.

Używałem org.apache.logging.log4j.Logger(: :) FML natomiast powinny użyłem org.apache.log4j.Logger. Korzystanie z tego poprawnego rejestratora uratowało mi wieczór.

avp
źródło
0

Miałem podobny problem z plikiem log4j.xml do testu jednostkowego, wykonałem wszystkie powyższe czynności. Ale zorientowałem się, że to dlatego, że tylko ponownie przeprowadziłem test, który zakończył się niepowodzeniem ... jeśli ponownie uruchomię całą klasę testu, zostanie pobrany właściwy plik. To jest w Intelli-j 9.0.4

James B.
źródło