1

環境:
Eclipse Juno
Junit 4.11
maven 3.0.4

問題:

eclipse の junit ランナーで単体テストを実行するときに、クラスローディングの問題があると思います。私の特定の問題は、次のコードに起因します。

this.getClass().forName(type);

上記のコードは、最終的に Maven 依存関係にあるクラスの名前で呼び出されます (依存関係は単に Java Bean のコレクションです)。mvn テストを実行すると、このコードは正常に実行されますが、eclipse を使用して junit テストを実行すると、class not found 例外が発生します。

実行構成のクラスパス タブにあるクラスパス エントリは、Maven の依存関係を参照します。したがって、依存関係が取り込まれていない理由がわかりません。

なぜこれが起こるのでしょうか?私はEclipseにMavenプラグインをインストールしているので、同じクラスパスを使用する必要があります。しかし、すべてが同じというわけではないようです。クリーンアップ、maven プロジェクト構成の更新、Eclipse の再起動を試みました。

.classpath ファイル

<?xml version="1.0" encoding="UTF-8"?>
<classpath>
    <classpathentry kind="src" output="target/classes" path="src/main/java">
        <attributes>
            <attribute name="optional" value="true"/>
            <attribute name="maven.pomderived" value="true"/>
        </attributes>
    </classpathentry>
    <classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources">
        <attributes>
            <attribute name="maven.pomderived" value="true"/>
        </attributes>
    </classpathentry>
    <classpathentry kind="src" output="target/test-classes" path="src/test/java">
        <attributes>
            <attribute name="optional" value="true"/>
            <attribute name="maven.pomderived" value="true"/>
        </attributes>
    </classpathentry>
    <classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources">
        <attributes>
            <attribute name="maven.pomderived" value="true"/>
        </attributes>
    </classpathentry>
    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5">
        <attributes>
            <attribute name="maven.pomderived" value="true"/>
        </attributes>
    </classpathentry>
    <classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
        <attributes>
            <attribute name="maven.pomderived" value="true"/>
        </attributes>
    </classpathentry>
    <classpathentry kind="output" path="target/classes"/>
</classpath>

.project ファイル

<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
    <name>brokenClasspathproject</name>
    <comment></comment>
    <projects>
    </projects>
    <buildSpec>
        <buildCommand>
            <name>org.eclipse.wst.common.project.facet.core.builder</name>
            <arguments>
            </arguments>
        </buildCommand>
        <buildCommand>
            <name>org.eclipse.jdt.core.javabuilder</name>
            <arguments>
            </arguments>
        </buildCommand>
        <buildCommand>
            <name>org.eclipse.m2e.core.maven2Builder</name>
            <arguments>
            </arguments>
        </buildCommand>
    </buildSpec>
    <natures>
        <nature>org.eclipse.jdt.core.javanature</nature>
        <nature>org.eclipse.m2e.core.maven2Nature</nature>
        <nature>org.eclipse.wst.common.project.facet.core.nature</nature>
    </natures>
</projectDescription>


ジャンット構成

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<launchConfiguration type="org.eclipse.jdt.junit.launchconfig">
<stringAttribute key="bad_container_name" value="/brokenClasspathproject/junit"/>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
<listEntry value="/brokenClasspathproject"/>
</listAttribute>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
<listEntry value="4"/>
</listAttribute>
<stringAttribute key="org.eclipse.jdt.junit.CONTAINER" value="=brokenClasspathproject"/>
<booleanAttribute key="org.eclipse.jdt.junit.KEEPRUNNING_ATTR" value="false"/>
<stringAttribute key="org.eclipse.jdt.junit.TESTNAME" value=""/>
<stringAttribute key="org.eclipse.jdt.junit.TEST_KIND" value="org.eclipse.jdt.junit.loader.junit4"/>
<stringAttribute key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER" value="org.eclipse.m2e.launchconfig.classpathProvider"/>
<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value=""/>
<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="brokenClasspathproject"/>
<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.m2e.launchconfig.sourcepathProvider"/>
</launchConfiguration>
4

1 に答える 1

1

なぜこれが起こっているのか理解できたと思います!

私が実行していたコードは単純です:

this.getClass().forName(name);

これはMavenで機能していましたが、junitスタンドアロンでは機能していませんでした。しかし、私が自分のプロパティを次のように変更したとき:

this.getClass().forName(com.packagename.name);

コードが機能し始めました。私は、surefireを使用するMavenが、nameとcom.packagename.nameの両方を認識するためにバックエンドブードゥーを実行していると想定しています。もし私が実際にjavadocsを読むのをやめていたら、class.forNameはパッケージ名を期待しているのを見たでしょう。

ですから、道徳は実際にjavadocsを読むことだと思います。これについてコメントしてくれたすべての人に謝罪(そして心からの感謝!)

于 2013-01-16T15:32:08.157 に答える