Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to pack resources in a Maven Project?

I am looking for suggestion in putting image file maven web project. One of classes under src/main/java need to use an image file. My problem is, if i put image file under src/main/webapp/images as well as under src/main/resources/Images then application server cannot find that path on runtime(where myeclipse can ) because war archive do not have specified path "src/main/webapp/images".

My question is where should i put the image file that my project can find it without prompting any error or exception.

I am using

  • Java Web Application with Mavenized falvour
  • MyEclipse 10
  • Application Server: JBoss 6

Currently i do have following dir structure

Project Directory Structure

-src/main/java
      -- classes
  -src/main/resources
     -- applicationContext.xml
  -src/main/resources/Images
      -- myImage.png (target image)
  -src/test/java
      -- test classes
  -src/test/resources
       (nothing)

  -src
    -- main
        --- webapp
              --WEB-INF
                 ---faces-config.xml
                 ---web.xml
              --Images
                 --OtherImages
                 --myImage.png( second place for image)
              --Css
              --Meta-INF
              --login.jspx
              --jsfPageType1
                 --page1.jspx
              --jsfPageType2
                 --page2.jspx
  -target
  -pom.xml

And pom.xml's build snippet is as follows

<build>
    <sourceDirectory>${basedir}/src/main/java</sourceDirectory>
    <outputDirectory>${basedir}/target/${project.artifactId}/classes</outputDirectory>
    <resources>
      <resource>
        <directory>${basedir}/src/main/resources</directory>
        <excludes>
          <exclude>**/*.java</exclude>
        </excludes>
      </resource>
    </resources>
    <testResources>
      <testResource>
        <directory>${basedir}/src/test/resources</directory>
      </testResource>
    </testResources>
    <finalName>${project.artifactId}</finalName>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>${jdk.version}</source>
          <target>${jdk.version}</target>
          <optimize>true</optimize>
          <useProjectReferences>true</useProjectReferences>
        </configuration>
      </plugin>
      <plugin>
        <artifactId>maven-war-plugin</artifactId>
        <version>2.1.1</version>
        <configuration>
          <warSourceDirectory>${basedir}/src/main/webapp</warSourceDirectory>
          <webResources>
            <resource>
              <directory>${basedir}/src/main/resources</directory>
              <directory>${basedir}/src/main/resources/Images</directory>
            </resource>
          </webResources>
        </configuration>
      </plugin>
    </plugins>
  </build>

and MyProject.war's dir structure look like

     MyProject.war

              --Images
                 ---OtherImages
              --Css
              --Meta-INF
              --login.jspx
              --jsfPageType1
                 --page1.jspx
              --jsfPageType2
                 --page2.jspx
               --WEB-INF
                  --classes
                       ---applicationContext.xml
                       ---com(classes package)
                       ---Images
                          ----myImage.png
                  --lib
                  --web.xml
                  --faces-config.xml

In MyClass i am trying to access image

1st Try

private static String PATH_TITLE_IMAGE = "src/main/resources/Images/myImage.png";
com.itextpdf.text.Image bckGrndImage = com.itextpdf.text.Image.getInstance(PATH_TITLE_PAGE_IMAGE);   

2nd Try

private static String PATH_TITLE_IMAGE = "src/main/webapp/Images/myImage.png";
    com.itextpdf.text.Image bckGrndImage = com.itextpdf.text.Image.getInstance(PATH_TITLE_PAGE_IMAGE);

as oers Said i should use

MyClass.class.getResource("/images/image.jpg")

after adding suggested solution (but it still dont work)

    private static String PATH_TITLE_IMAGE = "Images/myImage.png";
URL url =  MyClass.class.getResource(PATH_TITLE_IMAGE);
com.itextpdf.text.Image bckGrndImage = com.itextpdf.text.Image.getInstance(url);  

Thanks in advance

like image 381
Rehman Avatar asked Nov 15 '11 09:11

Rehman


People also ask

What is resources folder in Maven project?

Maven resources folder is used to store all your project resources files like , xml files, images, text files and etc. The default Maven resources folder is located at “yourproject/src/main/resources“.


3 Answers

The default resource directory for all Maven projects is src/main/resources which will end up in target/classes and in WEB-INF/classes in the WAR. The directory structure will be preserved in the process.

.
 |-- pom.xml
 `-- src
     `-- main
         |-- java
         |   `-- com
         |       `-- example
         |           `-- projects
         |               `-- SampleAction.java
         |-- resources
         |   `-- images
         |       `-- sampleimage.jpg
         `-- webapp
             |-- WEB-INF
             |   `-- web.xml
             |-- index.jsp
             `-- jsp
                 `-- websource.jsp

The suggested way to put your resources is in the src/main/resources

Reference: Adding and Filtering External Web Resources

like image 172
Andrei Sfat Avatar answered Sep 23 '22 07:09

Andrei Sfat


It seems that your problem is the way you read the image. You can't (or shouldn't) read the image from a Path. The Path might change on every system.

You need to read the image from the classpath like:

MyClass.class.getResource("/images/image.jpg")

or

MyClass.class.getResourceAsStream("/images/image.jpg")

For this to work, the image Folder needs to be on the classpath. Maven will put everything in the classpath, that is under main/resources. So thats where your image folder should be.

like image 27
oers Avatar answered Sep 25 '22 07:09

oers


You can use maven-resources-plugin to copy things to desired location.

something like this

<plugin>
      <artifactId>maven-resources-plugin</artifactId>
      <version>2.5</version>
      <executions>
        <execution>
          <id>copy-resources</id>
            <!-- here the phase you need -->
            <phase>validate</phase>
            <goals>
              <goal>copy-resources</goal>
            </goals>
            <configuration>
              <outputDirectory><!--your path here--></outputDirectory>
                <resources>          
                  <resource>
                    <directory><!--path-here--></directory>
                   </resource>
              </resources>              
            </configuration>      
          </execution>
        </executions>
      </plugin>

EDIT: based on your comment below, i think what you need is a properties file where you maintain path to the resources folder. That path will be an absolute path. Depending on your deployment you change that path in the properties file.

like image 35
Ravi Bhatt Avatar answered Sep 25 '22 07:09

Ravi Bhatt