Nếu sử dụng maven, thông thường bạn đặt log4j.properies dưới java hoặc tài nguyên?


128

Tôi nên đặt tệp log4j.properIES ở đâu khi sử dụng các thư mục Maven thông thường?


6
src / test / resource - người tiêu dùng của tạo phẩm của bạn sẽ đặt các mức ghi nhật ký cần thiết để triển khai. Tuy nhiên tôi muốn giới thiệu slf4j nếu bạn đang làm việc này cho công việc thương mại. Điều này cho phép tùy chọn chuyển đổi khung đăng nhập khi triển khai. slf4j.org
David Victor

2
BTW nếu bạn chỉ muốn thử nghiệm khả năng sử dụng log4j mà không cần tệp cấu hình thuộc tính / xml. Từ ' log.apache.org/log4j/1.2/manual.html - Cấu hình' "Việc gọi phương thức BasicConfigurator.configure tạo ra một thiết lập log4j khá đơn giản." Xem thêm: logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/... maven.apache.org/plugins/maven-resources-plugin/examples/...
David Victor

Câu trả lời:


141

src/main/resources là "vị trí tiêu chuẩn" cho việc này.

Cập nhật: Trên đây trả lời câu hỏi, nhưng nó không phải là giải pháp tốt nhất. Kiểm tra các câu trả lời khác và các nhận xét về điều này ... có thể bạn sẽ không vận chuyển các thuộc tính ghi nhật ký của riêng mình bằng bình mà thay vào đó để lại cho máy khách (ví dụ: máy chủ ứng dụng, môi trường sân khấu, v.v.) để định cấu hình ghi nhật ký mong muốn. Vì vậy, đặt nó vào src/test/resourceslà giải pháp ưa thích của tôi.

Lưu ý: Nói về việc để lại cấu hình nhật ký cụ thể cho khách hàng / người dùng, bạn nên xem xét thay thế log4jbằng slf4jtrong ứng dụng của mình.


Tôi tìm thấy không có tài nguyên diretcory được tạo ra. Tôi có cần phải làm bằng tay không?
dùng496949

3
Vâng. Tạo thủ công resourceslog4j.propertiestrong thư mục được đề cập trong câu trả lời.
Nishant

@ user496949: các tệp bên dưới src/main/resourcessẽ được sao chép theo mặc định thànhtarget/classes
giật gân

17
Trừ khi bạn có ý định xuất các cài đặt log4j như một phần của tạo phẩm của mình - tốt hơn hết là đặt nó dưới src / test / resource
David Victor

1
@FerasOdeh để loại trừ nó khỏi các tạo phẩm được tạo ra (bình, chiến tranh, v.v.) và chỉ được sử dụng trong quá trình thử nghiệm, "Trừ khi bạn có ý định xuất các cài đặt log4j như một phần của tạo phẩm của bạn".
Ali Shakiba

60

Chỉ cần đặt nó vào src/main/resourcessẽ bó nó bên trong cổ vật. Ví dụ: nếu tạo phẩm của bạn là JAR, bạn sẽ có log4j.propertiestệp bên trong nó, mất điểm ban đầu làm cho việc ghi nhật ký có thể định cấu hình được.

Tôi thường đặt nó vào src/main/resourcesvà đặt nó thành đầu ra cho mục tiêu như vậy:

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

Ngoài ra, để log4j thực sự nhìn thấy nó, bạn phải thêm thư mục đầu ra vào đường dẫn lớp. Nếu tạo phẩm của bạn là một JAR thực thi, có lẽ bạn đã sử dụng plugin maven-assembly-plugin để tạo nó. Bên trong plugin đó, bạn có thể thêm thư mục hiện tại của JAR vào đường dẫn lớp bằng cách thêm một Class-Pathmục nhập bảng kê khai như vậy:

<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>

Bây giờ tệp log4j.properIES sẽ ở ngay bên cạnh tệp JAR của bạn, có thể định cấu hình độc lập.

Để chạy ứng dụng của bạn trực tiếp từ Eclipse, hãy thêm resourcesthư mục vào đường dẫn lớp trong cấu hình chạy của bạn: Run->Run Configurations...->Java Application->Newchọn Classpathtab, chọn Advancedvà duyệt đến src/resourcesthư mục của bạn .


2
một tùy chọn khác có thể là đặt nó dưới src / test / resource để nó không bị bó.
rogerdpack

Ồ Cảm ơn vì điều đó. Đây chỉ là những gì tôi cần!
blissfool

@ Zoltán, tôi thấy khó khăn khi thêm thư mục đầu ra vào đường dẫn lớp như bạn đã khuyên. Có cách nào để tôi có thể thực hiện thủ công không, như đi vào tệp. Classpath của dự án cụ thể và thêm thư mục đầu ra log4j ở đó để log4j có thể thấy tệp .properations sau khi ứng dụng được gói vào tệp .war. Ngoài ra, thẻ targetPath, giá trị nên được sử dụng nguyên trạng ${project.build.directory}hay nên được chỉnh sửa theo đường dẫn thực tế mà dự án nằm trong ổ đĩa cục bộ của tôi?
Ireti

26

Một số tài khoản "khai thác dữ liệu" src/main/resourceslà nơi điển hình.

Kết quả về Tìm kiếm Google Code :

  • src/main/resources/log4j.properties: 4877
  • src/main/java/log4j.properties: 215

4
câu trả lời này khác nhau như thế nào so với câu trả lời 20 phút trước? Ngoài ra, nó resourceskhông resource, nếu tôi nhớ chính xác.
Nishant

6
@Nishant: nó không khác, vì khi tôi mở hộp câu trả lời tôi đã rời khỏi PC. Sau khi trở lại và trả lời câu hỏi tôi đã bỏ lỡ rằng câu hỏi đã được trả lời. resourcechỉ là một lỗi đánh máy.
giật gân

1
Tôi sẽ đề nghị thực hiện một số cách đọc xung quanh maven, plugin trình biên dịch maven, các quy ước để bố trí các dự án maven. Có thể nhìn vào những gì đi dưới 'mục tiêu' khi tạo tác của bạn được xây dựng. Sau đó, có lẽ bạn có thể sửa đổi câu trả lời của bạn.
David Victor

4
Câu trả lời đúng là src / xxx / resource - nó không phải là quy ước. Xem: maven.apache.org/plugins/maven-resource-plugin/examples/ mẹo - ở đây 'xxx' có thể là 'chính' hoặc 'thử nghiệm'. Trừ khi bạn muốn cung cấp các mức ghi nhật ký được định cấu hình trước, thông thường sẽ khôn ngoan hơn khi định cấu hình ghi nhật ký theo yêu cầu để kiểm tra - thông qua 'src / test / resource' - và cho phép người tiêu dùng tạo tác của bạn đặt mức ghi nhật ký.
David Victor

22
Kết quả của Google cho "Nhảy khỏi cây cầu": 18.200.000. Kết quả của Google cho "Đừng nhảy khỏi cây cầu": 137.000
djjeck

9

Các tài nguyên được sử dụng để khởi tạo dự án tốt nhất là đặt trong thư mục src / main / resource . Để cho phép tải các tài nguyên này trong quá trình xây dựng, người ta có thể chỉ cần thêm các mục trong tệp pom.xml trong dự án maven làm tài nguyên xây dựng

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

Các tệp .properations khác cũng có thể được giữ trong thư mục này được sử dụng để khởi tạo. Lọc được đặt thành đúng nếu bạn muốn có một số biến trong tệp thuộc tính của thư mục tài nguyên và điền chúng từ tệp thuộc tính của bộ lọc hồ sơ, được giữ trong src / main / bộ lọc được đặt làm hồ sơ nhưng đó là trường hợp sử dụng hoàn toàn khác . Để bây giờ, bạn có thể bỏ qua chúng.

Đây là một plugin tài nguyên maven tài nguyên tuyệt vời , nó rất hữu ích, chỉ cần duyệt qua các phần khác.


Nếu bạn chỉ sao chép và dán đoạn mã maven ở trên, xin lưu ý rằng đó là </ resource> </ build>
rdesilva

6

Khi đặt các tệp tài nguyên ở một vị trí khác không phải là giải pháp tốt nhất bạn có thể sử dụng:

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

Ví dụ: khi các tệp tài nguyên (ví dụ jaxb.properies) đi sâu vào bên trong các gói cùng với các lớp Java.


1

Nếu tệp log4j.properies hoặc log4j.xml của bạn không được tìm thấy trong src / main / resource, hãy sử dụng PropertyConfigurator.configure ("log4j.xml") này;

   PropertyConfigurator.configure("log4j.xml");
   Logger logger = LoggerFactory.getLogger(MyClass.class);
   logger.error(message);

0

Thêm mã dưới đây từ các thẻ tài nguyên trong tệp pom.xml của bạn bên trong các thẻ xây dựng. vì vậy, điều đó có nghĩa là các thẻ tài nguyên phải nằm trong các thẻ xây dựng trong tệp pom.xml của bạn

<build>
    <resources>
        <resource>
            <directory>src/main/java/resources</directory>
                <filtering>true</filtering> 
         </resource>
     </resources>
<build/>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.