0

私は次のように構成されたプロジェクトを持っています

myproject/
         moduleA/
         moduleB/
         moduleC/

myprojectpom.xmlとして 持っています

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.6.4</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.0.3</version>
            <scope>provided</scope>
        </dependency>

依存関係を次のように参照するようにコードmoduleCが必要になりましたmoduleB

       <dependency>
            <groupId>com.org.myproject</groupId>
            <artifactId>moduleB</artifactId>
            <version>${project.version}</version>
        </dependency>

しかし、でクラスを実行するとmoduleC、文句を言います

Exception in thread "main" java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory
......
Caused by: java.lang.ClassNotFoundException: org.slf4j.LoggerFactory

moduleCこれは、クラスがコードを実行するときに発生しmoduleBます。

私が間違っているのは何ですか?どうすればこれを修正できますか?

4

2 に答える 2

7

依存関係を「provided」に設定しています。これは、依存関係がランタイム クラスパスに含まれないことを意味します。基本的に、実行時にこれらのファイルを提供することをMavenに伝えているため、コンパイル用に存在しますが、クラスパスに手動で配置しない限り、実行時に存在しません。

各スコープ レベルの詳細については、 http : //maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Dependency_Scopeを参照してください。

何も指定しない場合、スコープはコンパイルされます。

Compile はデフォルトのスコープで、何も指定されていない場合に使用されます。コンパイルの依存関係は、プロジェクトのすべてのクラスパスで利用できます。さらに、それらの依存関係は依存プロジェクトに伝播されます。

そのため、スコープ タグを省略したり、明示的にコンパイルとして追加したりできます。アプリを実行すると、依存関係がランタイム クラスパスに含まれます。

于 2012-09-17T23:38:18.680 に答える
1

@Daveのコメントによると、私は以下を追加しましたが、pom.xml通常どおり機能し始めました。

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.6.6</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.0.6</version>
        </dependency>
于 2012-09-18T13:10:57.310 に答える