2010-09-15 79 views
13

Làm cách nào để bạn thêm thư mục (ví dụ: thư mục tài nguyên chứa nghệ thuật) vào đường dẫn lớp của dự án netbeans? Tôi quản lý để làm điều đó bằng tay thông qua chỉnh sửa NB jar tạo ra tập tin của dự án (đó là tập tin MANIFEST.MF của nó + sao chép các nguồn tài nguyên bằng tay), nhưng cần phải có một cách để nói netbeans cũng như tâm tài nguyên, không?Cách thêm tài nguyên vào đường dẫn lớp

cấu Thư mục trông như thế này:

/project/art/ 
/project/dist/lib/ 
/project/dist/art/ 
/project/dist/project.jar 
/project/lib/ 
/project/src/ 

Tôi không muốn gói nghệ thuật vào jar vì tôi muốn nghệ thuật được dễ dàng trao đổi. Nếu tôi thêm thư mục nghệ thuật vào thư mục src thì NB biên dịch tốt, nhưng tài nguyên nghệ thuật sẽ kết thúc trong bình.

Thêm thư mục nghệ thuật vào thư viện dự án netbeans (Thuộc tính -> Thư viện -> Thêm JAR/Thư mục) có vẻ không hoạt động, vì sau đó tôi kết thúc với lỗi '... \ project \ art là một thư mục hoặc không thể đọc được. Không sao chép các thư viện. ' điều này sẽ ngăn không cho thư viện thực sự bị sao chép.

Bất kỳ ý tưởng nào?

Trân trọng Chris

2 Quan sát thực hiện, dựa trên ý kiến ​​từ gpeche: a) xác định Thay vì thư mục nguồn lực bổ sung trong "Run" tab hơn trong "biên dịch" tab trong những tài sản dự án - > Thư viện dường như không tạo ra nhiều khác biệt trong Netbeans (Tôi hiện đang sử dụng 6.9.1). Sản lượng (và do đó lỗi) giữ nguyên, đó là không có gì được sao chép ở tất cả:

Created dir: C:\Users\Chrisi\Desktop\vocabulary\VocabularyTrainer\dist 
C:\Users\Chrisi\Desktop\vocabulary\VocabularyTrainer\art is a directory or can't be read. Not copying the libraries. 
Not copying the libraries. 
Building jar: C:\Users\Chrisi\Desktop\vocabulary\VocabularyTrainer\dist\VocabularyTrainer.jar 

Một khía cạnh thú vị là trong menu trợ giúp của Libraries bảng không có gì được đề cập một cách rõ ràng liên quan đến thư mục như thư viện. Nó có thể được, rằng các nút trong Netbeans là sai tên, đó là chỉ thực sự của jar được cho phép?

b) Thêm thư mục tài nguyên vào danh sách Thư viện không có tác động, để thêm mục nhập khác vào MANIFEST.MF. Mặc dù - và đó là vấn đề nhỏ hơn - mục nhập classpath dường như luôn mong thư mục tài nguyên trở thành thư mục con của thư mục thư viện (ví dụ: "lib/arts"), vấn đề chính là dường như dấu gạch chéo bị thiếu. Như đã đề cập, mục nhập NB được tạo trong MANIFEST.MF sẽ trông giống như "lib/arts" (không hoạt động đối với tôi), trong khi (đặt thủ công) "lib/arts /"?

Con đường tôi sử dụng các nguồn lực từ các thư mục là một cái gì đó như thế này:

URL resource = getClass().getResource("/gui/refresh.png"); 
ImageIcon tmp = new ImageIcon(resource); 

Edit:

Dựa trên Tushars bình luận và this posting Tôi tìm thấy giải pháp sau đây để có một sự cân bằng có thể chấp nhận giữa chức năng và thoải mái.

Tôi ghi đè mục tiêu ANT từ tệp 'build-impl.xml' được tạo tự động để tạo Lớp-Đường dẫn trong tệp MANIFEST.MF trong tệp 'build.xml' cơ bản của dự án Netbeans. Các mã mà đi đến tập tin 'build.xml' trông như thế này:

<property name="art.classpath" value="art/" /> 

    <target name="-post-jar"> 
    <mkdir dir="${dist.dir}/art"/> 
    <copy todir="${dist.dir}/art"> 
     <fileset dir="${basedir}/art"> 
     <!-- <exclude name="**/!source/**"/> if you want to exclude something... --> 
     </fileset> 
    </copy> 
    </target> 

    <target name="-init-macrodef-copylibs"> 
    <macrodef name="copylibs" uri="http://www.netbeans.org/ns/j2se-project/3"> 
     <element name="customize" optional="true"/> 
     <sequential> 
     <property location="${build.classes.dir}" name="build.classes.dir.resolved"/> 
     <pathconvert property="run.classpath.without.build.classes.dir"> 
      <path path="${run.classpath}"/> 
      <map from="${build.classes.dir.resolved}" to=""/> 
     </pathconvert> 
     <pathconvert pathsep=" " property="jar.classpath"> 
      <path path="${run.classpath.without.build.classes.dir}"/> 
      <chainedmapper> 
      <flattenmapper/> 
      <globmapper from="*" to="lib/*"/> 
      </chainedmapper> 
     </pathconvert> 
     <taskdef classname="org.netbeans.modules.java.j2seproject.copylibstask.CopyLibs" classpath="${libs.CopyLibs.classpath}" name="copylibs"/> 
     <copylibs compress="${jar.compress}" index="${jar.index}" jarfile="${dist.jar}" manifest="${manifest.file}" runtimeclasspath="${run.classpath.without.build.classes.dir}"> 
      <fileset dir="${build.classes.dir}"/> 
      <manifest> 
      <attribute name="Class-Path" value="${jar.classpath} ${art.classpath}"/> 
      <customize/> 
      </manifest> 
     </copylibs> 
     </sequential> 
    </macrodef> 
    </target> 

Sự cân bằng được rằng để phát triển trong Netbeans tôi vẫn phải thêm thư mục tài nguyên (ví dụ như 'nghệ thuật') để các thư viện liệt kê để làm cho dự án chạy trong Netbeans. Điều này sẽ gây ra một mục nhập bổ sung trong MANIFEST.tập MF ('lib/nghệ thuật') cùng với các hiệu ứng mà các thư viện sẽ không được tự động sao chép vào thư mục 'quận', với thông điệp

...\art is a directory or can't be read. Not copying the libraries. 
Not copying the libraries. 

behavor Đây là - afaik - dự định (để buộc tất cả mọi thứ để được đóng gói trong một cái lọ), mặc dù có những cuộc thảo luận về nó đang diễn ra. Để thực hiện một gói phân phối thực sự, tôi sẽ phải lấy đi (các) thư mục tài nguyên từ danh sách thư viện trong NB và xây dựng lại.

Ý tưởng về thiết lập được sắp xếp hợp lý hơn mà không có bất kỳ sự cân bằng nào cũng được hoan nghênh. :)

Trả lời

12
  1. Thêm thư mục tài nguyên để classpath:

    Khi bạn Clean- & -Xây dựng một dự án dựa trên NetBeans Ant nó tạo ra một tập tin manifest.mf trong thư mục gốc của dự án. Tệp này cũng được đưa vào tệp JAR. Sửa đổi tệp này và thêm mục nhập như sau:

    Manifest-Version: 1.0 
    X-COMMENT: Main-Class will be added automatically by build 
    Class-Path: arts/ 
    

    dấu gạch chéo là quan trọng sau nghệ thuật trong đường dẫn lớp.

  2. Bao gồm các thư mục tài nguyên nghệ thuật trong việc phân phối

    Hoặc copy thư mục này trong thư mục TP sau khi xây dựng hoặc thêm một mục tiêu ANT để sao chép các nguồn lực cần thiết trong thư mục dist.

    Thêm mục tiêu như như sau trong file build.xml:

    <target name="-post-jar"> 
        <mkdir dir="${dist.dir}/resources"/> 
        <copy todir="${dist.dir}/resources"> 
         <fileset dir="${basedir}/resources" /> 
        </copy> 
    </target> 
    
  3. Mã để truy cập tài nguyên như:

    Các mã cần thiết để truy cập vào các file tài nguyên như vậy được thực hiện như sau: (Điều này sẽ không hoạt động trong thời gian thiết kế nhưng chắc chắn từ tệp JAR)

    // pay attention to relative path 
    URL resource = ClassLoader.getSystemResource("gui/refresh.png"); 
    ImageIcon tmp = new ImageIcon(resource); 
    

    LƯU Ý: Tệp manifest.mf và build.xml nằm trong thư mục gốc của dự án có thể truy cập từ Bảng Tệp trong NetBeans IDE

+0

1) thêm nội dung nào đó vào tệp manifest.mf của dự án NB (đó là Class-Path trong trường hợp này) có vẻ ghi đè bất kỳ thứ gì khác sẽ đến đó (ví dụ: các thư viện khác được thêm vào dự án). Bất kỳ ý tưởng làm thế nào để có được con đường ban đầu trở lại là tốt? Ví dụ, các thư viện chính nó sẽ được sao chép. 3) đối với tôi nó không hoạt động mà không có dấu gạch chéo hàng đầu - tôi phải thêm dấu gạch chéo đó, sau đó nó hoạt động. – ChristianS

+0

Tôi sẽ đề nghị đầu tiên tạo manifest.mf từ xây dựng NetBeans và sau đó sử dụng các giá trị đường dẫn lớp mặc định cộng với đường dẫn thư mục bổ sung của bạn được thêm vào. –

+0

Vui lòng thêm hướng dẫn cách loại trừ tài nguyên thư mục, vì vậy nó sẽ không được bao gồm trong .jar – GusDeCooL

1

Để loại bỏ lib/art khỏi Lớp-Đường dẫn và không nhận được "là một thư mục hoặc không thể được đọc" cần xóa lib/nghệ thuật từ đường dẫn:

<pathconvert property="run.classpath.without.build.classes.dir"> 
     <path path="${run.classpath}"/> 
     <map from="${build.classes.dir.resolved}" to=""/> 
     **<map from="${basedir}/art" to=""/> <!-- remove art from lib -->** 
    </pathconvert> 
8

Sử dụng NetBeans 8.0.2:

  1. kích chuột phải vào dự án.
  2. Chọn Thuộc tính.
  3. Chọn Nguồn.
  4. Nhấp vào Thêm thư mục cho Thư mục gói nguồn.
  5. Chọn thư mục chứa tài nguyên.
  6. Nhấp vào Mở trên tên thư mục.
  7. Nhấp vào OK để đóng hộp thoại Thuộc tính dự án.

Tài nguyên được thêm vào dự án.

Bạn sẽ thấy thư mục được thêm trong ngăn Điều hướng của mình cũng như

Trong dự án khác, tài nguyên hiện có sẵn. Ví dụ: để đọc hình ảnh:

BufferedImage zero = ImageIO.read(OCR.class.getResourceAsStream("/0.bmp")); 
Các vấn đề liên quan