1

私は次のように埋め込まれたガラス魚を使用しました:

public static void createContainer() throws IOException {        
    File target = new File("target/classes");       
    Map<String, Object> properties = new HashMap<String, Object>();
    properties.put(EJBContainer.MODULES, target);
    properties.put("org.glassfish.ejb.embedded.glassfish.installation.root",
            "/opt/glassfish3/glassfish");
    container = EJBContainer.createEJBContainer(properties);
    context = container.getContext();
}

@AfterSuite(alwaysRun = true)
public static void closeContainer() throws NamingException {
    // close container
}

// I use this method to lookup 
public static <T> T lookupBy(Class<T> type) {
    try {
        return (T) context.lookup("java:global/classes/" + type.getSimpleName());
    } catch (NamingException ex) {
        throw new RuntimeException(ex);
    }
}

問題は、埋め込まれたGlassfishが「target / classes」のクラスを使用し、mavencoberturaが「target/generated-classes/cobertura」を使用することです。次に、最初にテストを実行しても問題ありませんが、2回目に、coberturaを実行すると、java.lang.RuntimeException:javax.naming.NamingExceptionを受け取ります(おそらく、coberturaが「target /generated-classes/cobertura」に取り組んでいるためです。 「glassfishが「ターゲット/クラス」に取り組んでいる間)。

この問題を解決するためのアイデアはありますか?

4

1 に答える 1

0

cobertura と glassfish-embedded で同じ問題を実験しました。これがそれを解決するための私のセットアップです。

特定のオプションなしで、maven の依存関係にglassfish -embedded-allcoberturaを含めました。私は EJBContainer プロパティEJBContainer.MODULESを使用しません。glassfish -embedded は、通常または cobertura フェーズで ejb クラスを単独で検出します。

ただし、JNDI ポータブル名は、通常のケースと cobertura のケースで異なります。したがって、これら 2 つのケースを管理するために、lookupBy メソッドを適応させました。

最後に、ここに私のコードがあります:

public static void createContainer() throws IOException {        
    container = EJBContainer.createEJBContainer();
    context = container.getContext();
    MyServiceLocal ejb = lookupBy(MyServiceLocal.class,MyServiceImpl.class);
}

public static <T> T lookupBy(Class<T> type, Class service) {
    try {
        return (T) context.lookup("java:global/classes/" + service.getSimpleName());
    } catch (NamingException ex) {
        // lookup with cobertura
        return (T) context.lookup("java:global/cobertura/" + service.getSimpleName() + "!" + type.getName());
    }
}
于 2012-03-16T12:34:29.557 に答える