maven test cannot load cross-module resources/properties ?

classic Classic list List threaded Threaded
6 messages Options
Reply | Threaded
Open this post in threaded view
|

maven test cannot load cross-module resources/properties ?

smallufo

I have a maven mantained project with some modules . One module contains one XML file and one parsing class.

Second module depends on the first module. There is a class that calls the parsing class in the first module , but maven seems cannot test the class in the second module. Maven test reports :


java.lang.NullPointerException
 at java
.util.Properties.loadFromXML(Properties.java:851)
 at foo
.firstModule.Parser.<init>(Parser.java:92)
 at foo
.secondModule.Program.<init>(Program.java:84)

In "Parser.java" (in the first module) , it uses Properties and InputStream to read/parse an XML file :


InputStream xmlStream = getClass().getResourceAsStream("Data.xml");
Properties properties = new Properties();
properties
.loadFromXML(xmlStream);

The "data.xml" is located in first module's resources/foo/firstModule directory , and it tests OK in the first module.

It seems when testing the second module , maven cannot correctly load the Data.xml in the first module .

I thought I can solve the problem by using maven-dependency-plugin:unpack to solve it . In the second module's POM file , I add these snippets :


<plugin>
 
<groupId>org.apache.maven.plugins</groupId>
 
<artifactId>maven-dependency-plugin</artifactId>
 
<version>2.1</version>
 
<executions>
   
<execution>
     
<id>data-copying</id>
     
<phase>test-compile</phase>
     
<goals>
       
<goal>unpack</goal>
     
</goals>
     
<configuration>
       
<artifactItems>
         
<artifactItem>
           
<groupId>foo</groupId>
           
<artifactId>firstModule</artifactId>
           
<type>jar</type>
           
<includes>foo/firstModule/Data.xml</includes>
           
<outputDirectory>${project.build.directory}/classes</outputDirectory>
         
</artifactItem>
       
</artifactItems>
     
</configuration>
   
</execution>        
 
</executions>
</plugin>

In this POM file , I try to unpack the first module , and copy the Data.xml to classes/foo/firstModule/ directory , and then run tests.

And indeed , it is copied to the right directory , I can find the "Data.xml" file in "target/classes/foo/firstModule" directory. But maven test still complains it cannot read the File (Properties.loadFromXML() throws NPE).

I don't know how to solve this problem. I tried other output directory , such as ${project.build.directory}/resources , and ${project.build.directory}/test-classes , but all in vain...

Any advices now ? Thanks in advanced.

Environments : Maven 2.2.1 , eclipse , m2eclipse

Reply | Threaded
Open this post in threaded view
|

Re: maven test cannot load cross-module resources/properties ?

Igor Fedorenko-3
Does everything work when you run the build from command line?

--
Regards,
Igor

smallufo wrote:

> I have a maven mantained project with some modules . One module contains
> one XML file and one parsing class.
>
> Second module depends on the first module. There is a class that calls
> the parsing class in the first module , but maven seems cannot test the
> class in the second module. Maven test reports :
>
>
> |java.lang.NullPointerException
>
>
>  at java.util.Properties.loadFromXML(Properties.java:851)
>
>
>  at foo.firstModule.Parser.<init>(Parser.java:92)
>
>
>  at foo.secondModule.Program.<init>(Program.java:84)
>
>
> |
>
> In "Parser.java" (in the first module) , it uses Properties and
> InputStream to read/parse an XML file :
>
>
> |InputStream xmlStream = getClass().getResourceAsStream("Data.xml");
>
>
> Properties properties = new Properties();
>
>
> properties.loadFromXML(xmlStream);
>
>
> |
>
> The "data.xml" is located in first module's resources/foo/firstModule
> directory , and it tests OK in the first module.
>
> It seems when testing the second module , maven cannot correctly load
> the Data.xml in the first module .
>
> I thought I can solve the problem by
> using *maven-dependency-plugin:unpack* to solve it . In the second
> module's POM file , I add these snippets :
>
>
> |<plugin>
>
>
>  <groupId>org.apache.maven.plugins</groupId>
>
>
>  <artifactId>maven-dependency-plugin</artifactId>
>
>
>  <version>2.1</version>
>
>
>   <executions>
>
>
>     <execution>
>
>
>       <id>data-copying</id>
>
>
>       <phase>test-compile</phase>
>
>
>       <goals>
>
>
>         <goal>unpack</goal>
>
>
>       </goals>
>
>
>       <configuration>
>
>
>         <artifactItems>
>
>
>           <artifactItem>
>
>
>             <groupId>foo</groupId>
>
>
>             <artifactId>firstModule</artifactId>
>
>
>             <type>jar</type>
>
>
>             <includes>foo/firstModule/Data.xml</includes>
>
>
>             <outputDirectory>${project.build.directory}/classes</outputDirectory>
>
>
>           </artifactItem>
>
>
>         </artifactItems>
>
>
>       </configuration>
>
>
>     </execution>        
>
>
>   </executions>
>
>
> </plugin>
>
>
> |
>
> In this POM file , I try to unpack the first module , and copy the
> Data.xml to classes/foo/firstModule/ directory , and then run tests.
>
> And indeed , it is copied to the right directory , I can find the
> "Data.xml" file in "target/classes/foo/firstModule" directory. But maven
> test still complains it cannot read the File (Properties.loadFromXML()
> throws NPE).
>
> I don't know how to solve this problem. I tried other output directory ,
> such as ${project.build.directory}/resources , and
> ${project.build.directory}/test-classes , but all in vain...
>
> Any advices now ? Thanks in advanced.
>
> Environments : Maven 2.2.1 , eclipse , m2eclipse
>

---------------------------------------------------------------------
To unsubscribe from this list, please visit:

    http://xircles.codehaus.org/manage_email


Reply | Threaded
Open this post in threaded view
|

Re: maven test cannot load cross-module resources/properties ?

smallufo


2010/6/6 Igor Fedorenko <[hidden email]>
Does everything work when you run the build from command line?


Hi 
The error messages are the same when running from the command line. 

Reply | Threaded
Open this post in threaded view
|

Re: maven test cannot load cross-module resources/properties ?

Igor Fedorenko-3
Are you sure you got your paths right, i.e. foo/firstModule/Data.xml vs
just Data.xml? Also, this problem is not m2eclipse specific, so you
probably want to ask this question on maven-users mailing list.

--
Regards,
Igor

smallufo wrote:

>
>
> 2010/6/6 Igor Fedorenko <[hidden email] <mailto:[hidden email]>>
>
>     Does everything work when you run the build from command line?
>
>
> Hi
> The error messages are the same when running from the command line.
>

---------------------------------------------------------------------
To unsubscribe from this list, please visit:

    http://xircles.codehaus.org/manage_email


Reply | Threaded
Open this post in threaded view
|

Re: maven test cannot load cross-module resources/properties ?

smallufo
Sorry , I forget to mention , that the Program in the 2nd module , extends the Parser in the 1st module , 
and in the Parser's constructor , properties are loaded and parsed.
In fact , Program is another Parser with further capabilities... ...

I think it may be because Program extends Parser , causing the problem.
If I disconnect the "extends" , initializing (new) the Parser in Program , it will be OK , test passes !
But I cannot change the inheritance relation ... it's designed ...

Any solutions now ?


2010/6/6 Igor Fedorenko <[hidden email]>
Are you sure you got your paths right, i.e. foo/firstModule/Data.xml vs
just Data.xml? Also, this problem is not m2eclipse specific, so you
probably want to ask this question on maven-users mailing list.

--
Regards,
Igor

smallufo wrote:


2010/6/6 Igor Fedorenko <[hidden email] <mailto:[hidden email]>>


   Does everything work when you run the build from command line?


Hi The error messages are the same when running from the command line.

---------------------------------------------------------------------
To unsubscribe from this list, please visit:

  http://xircles.codehaus.org/manage_email



Reply | Threaded
Open this post in threaded view
|

Re: maven test cannot load cross-module resources/properties ?

smallufo
Here is my full code with test case :

This is Parser in the first module :


package foo.firstModule;

import java.io.IOException;
import java.io.InputStream;
import java.util.InvalidPropertiesFormatException;
import java.util.Properties;

public class Parser
{
 
private Properties properties;

 
public Parser()
 
{
   
InputStream xmlStream = getClass().getResourceAsStream("Data.xml");
    properties
= new Properties();
   
try
   
{
      properties
.loadFromXML(xmlStream);
   
}
   
catch (InvalidPropertiesFormatException e)
   
{
      e
.printStackTrace();
   
}
   
catch (IOException e)
   
{
      e
.printStackTrace();
   
}
 
}

 
public Properties getProperties()
 
{
   
return properties;
 
}
}

This is Parser's test case , passed .


package foo.firstModule;

import junit.framework.TestCase;

public class ParserTest extends TestCase
{
 
public void testParser()
 
{
   
Parser p = new Parser();
    assertEquals
(64 , p.getProperties().size());
 
}
}

This is ParserExtend in the secondModule , which extends Parser in the firstModule :


package foo.secondModule;

import java.util.Properties;

import foo.firstModule.Parser;

public class ParserExtend extends Parser
{
 
private Properties properties;

 
public ParserExtend()
 
{
   
this.properties = getProperties();
 
}

 
public int getSize()
 
{
   
return properties.size();
 
}
}

This is ParserExtend's test case :


package foo.secondModule;

import junit.framework.TestCase;

public class ParserExtendTest extends TestCase
{
 
public void testParserExtend()
 
{
   
ParserExtend pe = new ParserExtend();
    assertEquals
(64 , pe.getSize());
 
}
}

The above test case failed because Properties.loadFromXML(Properties.java:851) throws NPE

However , if I don't extend Parser , just new the Parser :


package foo.secondModule;

import java.util.Properties;

import foo.firstModule.Parser;

public class ParserInit
{
 
private Properties properties;

 
public ParserInit()
 
{
   
Parser p = new Parser();
   
this.properties = p.getProperties();
 
}

 
public int getSize()
 
{
   
return properties.size();
 
}
}

and this is the test case :


package foo.secondModule;

import junit.framework.TestCase;

public class ParserInitTest extends TestCase
{
 
public void testParserInit()
 
{
   
ParserInit pi = new ParserInit();
    assertEquals
(64 , pi.getSize());
 
}
}

The test case passes !

This is my whole test scenario. Anybody able to find how to pass the ParserExtend's test case ? Thanks in advanced.