3

私は、多くの小さなモジュール式プロジェクトを構築することによって、大きなJavaプロジェクトを構築しようとしています。それぞれの小さなプロジェクトが完全に自己完結型であり、そのすべてのリソース(画像など)を保持していることを望んでいます。

私はEclipseを使用しています。モジュラープロジェクトの1つを追加するようにビルドパスを構成すると、リソース参照が機能しません。システムは、指定されたファイルを見つけることができません。jarをエクスポートして、ビルドパスの構成の[ライブラリ]タブに含めると、同じことが起こります。

私はいくつかの実験を行いましたが、それを機能させる方法を見つけることができませんでした。リソースのソースフォルダを使用して、次のものを使用してみました。

// this works if resource is located in package alongside class file, 
// not where I want it
getClass().getResourceAsStream("resource.abc")

また

new FileInputStream("path/to/resource.abc")

たぶん私はプロジェクトがどのように構成されているかについて何かが欠けています。私は常に、IDE内の単一のプロジェクトから問題なくリソースを機能させることができました。複数のプロジェクトをリンクしたり、それらをjarとして含めたりする場合の違いは何ですか?

私の理想的な構造は、プロジェクトのルートにあるsrcフォルダーと同じレベルに、ソースコードとは別にすべてのリソースを含む別のフォルダーを作成することです。これは、プロジェクト/jarをリンクしようとするすべての問題の前に設定された方法です。

4

3 に答える 3

1

この解決策は私のために働いた:

/**
 *
 * @author David
 */
public class JavaApplication60 {
/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    //http://img.viralpatel.net/java-cup-logo.png

    //located in a package not in the current one
    URL url = new JavaApplication60().getResource("/javaapplication60/newpackage/java-cup-logo.png");
    System.out.println(url.getPath());
    //located in same package
    url = new JavaApplication60().getResource("/javaapplication60/java-cup-logo.png");
    System.out.println(url.getPath());
}

public InputStream getResourceAsStream(String name) {
    name = resolveName(name, this.getClass());
    ClassLoader cl = getClass().getClassLoader();
    if (cl == null) {
        return ClassLoader.getSystemResourceAsStream(name); // A system class.
    }
    return cl.getResourceAsStream(name);
}

public java.net.URL getResource(String name) {
    name = resolveName(name, this.getClass());
    ClassLoader cl = getClass().getClassLoader();
    if (cl == null) {
        return ClassLoader.getSystemResource(name);  // A system class.
    }
    return cl.getResource(name);
}


/*
 * The resolveName method adds a package name prefix if the name is not
 * absolute, and removes any leading "/" if the name is absolute. It is
 * possible, though uncommon, to have classes in diffent packages sharing
 * the same resource.
 */
private String resolveName(String name, Object clazz) {
    if (name == null) {
        return name;
    }
    if (!name.startsWith("/")) {
        Class c = clazz.getClass();
        while (c.isArray()) {
            c = c.getComponentType();
        }
        String baseName = c.getName();
        int index = baseName.lastIndexOf('.');
        if (index != -1) {
            name = baseName.substring(0, index).replace('.', '/') + "/" + name;
        }
    } else {
        name = name.substring(1);
    }
    return name;
}
}

私のパッケージ構造は次のようになりました。

上記のコードのパッケージ構造

参照:

于 2012-08-19T20:03:45.453 に答える
0

リソース用に別のソースフォルダーを追加するには、最初にフォルダーを作成します。Javaパースペクティブで、プロジェクトを選択し、コンテキストメニューから[ビルドパスの構成]を選択します。[ソースフォルダー]タブで、新しく作成したフォルダーをプロジェクトのソースフォルダーにすることができます。それ以降、そのフォルダーの下にあるすべてのリソースを、プロジェクトクラスを使用してjarにエクスポートできます。

ちなみに、getResourceAsStreamに指定するパスは、リソースがクラスと同じパッケージにある場合はリソースファイル名のみ、またはソースフォルダーからのリソースの相対パス名(スラッシュで始まる)のいずれかです。を使用します。

于 2012-08-19T20:00:05.873 に答える
0

1つのアプリケーションで構成される複数のプロジェクトがありますか?では、これをEclipse経由で実行すると、すべて機能しますか?
はいの場合は、メインプロジェクトで実行しますExport as Runnable Jar。これも機能するはずです

于 2012-08-19T21:28:18.307 に答える