Arquillian ShrinkWrap

2019-07-05 05:20发布

问题:

I'm having trouble creating a JUnit test using a pom.xml dependency.

The test are being run with Arquillian

@RunWith(Arquillian.class)

In this method

@Deployment
public static JavaArchive createDeployment() {

First, I create a JavaArchive with the package of the project I'm testing

   JavaArchive merge =  ShrinkWrap.create(JavaArchive.class).
            addPackages(true,
                    "migrazioneGeaPersistenzaTampone",
                    "migrazioneGeaPersistenza",
                    "it.**.mistral.importGEA4.task",
                    "migrazioneGeaPersistenzaAccess"
            ).
           addClasses(java.sql.Connection.class)
            .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");

Then when I launch the test, there are some missing dependencies

Unable to resolve any beans for Types: [class it.**.**.be.service.EnvironmentRootService]

present in this dependency

      <dependency>
        <groupId>it.**.mistral</groupId>
        <artifactId>mistral-be</artifactId>
        <version>0.1.0</version>
        <scope>compile</scope>  
     </dependency>

I have tried lots of different things to add these dependencies, the best one seems to be using the ShrinkWrap Resolvers (https://github.com/shrinkwrap/resolver/blob/master/README.asciidoc, particullarry this paragraph https://github.com/shrinkwrap/resolver/blob/master/README.asciidoc#resolution-of-artifacts-defined-in-pom-files)

a)

JavaArchive[] archives = Maven.resolver().loadPomFromFile(path_to_pom_file). importDependencies(ScopeType.TEST,ScopeType.COMPILE). resolve().withTransitivity().as(JavaArchive.class);

or

Maven.resolver().loadPomFromFile("/path/to/pom.xml").importRuntimeDependencies() .resolve().withTransitivity().asFile();

The dependency is ignored in either way (i'm missing something?)

b)

JavaArchive[] mistral_be = Maven.configureResolver().workOffline(). resolve("it.**.mistral:mistral-be:0.1.0").withTransitivity().as(JavaArchive.class);
for (int i = 0; i < mistral_be.length ; i++) {
merge = merge.merge(mistral_be[i]);
}

With a simple

System.out.println(merge.toString(true));

I can see that all files from dependencies are present! Anyway I use local repository workoffline() Maybe I am missing some dependencies?

But exiting the method with a

return merge;

throws a "java.lang.NoClassDefFoundError: com/google/protobuf/GeneratedMessage....Caused by: java.lang.ClassNotFoundException: com.google.protobuf.GeneratedMessage" error.

Then again i tried to add the missing dependecies

// Tryn'g to add protobuf dependencies JavaArchive[] prto_buf = Maven.configureResolver().withMavenCentralRepo(true).resolve("com.google.protobuf:protobuf-java:2.3.0").withTransitivity().as(JavaArchive.class);

       for (int i = 0; i < prto_buf.length ; i++) {
           projectPackages = projectPackages.merge(prto_buf[i]);
       }

Throws sameException... Again , with a simple

System.out.println(merge.toString(true));

I can see that com.Google.protobuf.GeneratedMessage is present

Extract of dependencies:

   <dependency>
        <groupId>org.jboss.spec</groupId>
        <artifactId>jboss-javaee-6.0</artifactId>
        <version>1.0.0.Final</version>
        <type>pom</type>
        <scope>provided</scope>
    </dependency>

    <dependency>
        <groupId>org.jboss.arquillian.junit</groupId>
        <artifactId>arquillian-junit-container</artifactId>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.jboss.arquillian.container</groupId>
        <artifactId>arquillian-weld-ee-embedded-1.1</artifactId>
        <version>1.0.0.CR3</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.jboss.shrinkwrap.resolver</groupId>
        <artifactId>shrinkwrap-resolver-depchain</artifactId>
        <version>2.1.0</version>
        <scope>test</scope>
    </dependency>


</dependencies>


<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.jboss.arquillian</groupId>
            <artifactId>arquillian-bom</artifactId>
            <version>1.1.5.Final</version>
            <scope>import</scope>
            <type>pom</type>
        </dependency>
    </dependencies>
</dependencyManagement>

Can anybody help me solve this issue?

回答1:

This smells to me like a classloading issue. Especially considering the fact that you are using embedded container which basically takes everything what's in there from your project classpath.

What is your target container you are deploying your application on? Maybe if you try to run your test there instead of embedded container you will at least see if that is really the problem, or there is still something wrong with your deployment artifact.