I am concentrating now on getting build-time enhancement working.

I thought I'd try with the maven-antrun-plugin using the config shown (copied from the list here) but I get this error - the offending class is an entity superclass which is in the jar in the error message. Java knows exactly which jar it is in, yet can't find it so I guess I've missed a simple piece of the config.

[java] Caused by: java.io.FileNotFoundException: file:/home/java/m2-repo/org/permacode/atomic/0.0.1-SNAPSHOT/atomic-0.0.1-SNAPSHOT.jar!/org/permacode/atomic/domain/AtomicEntity.class (No such file or directory)
     [java]     at java.io.FileOutputStream.open(Native Method)
     [java]     at java.io.FileOutputStream.<init>(FileOutputStream.java:179)
     [java]     at java.io.FileOutputStream.<init>(FileOutputStream.java:70)
     [java]     at serp.bytecode.BCClass.write(BCClass.java:179)
[java] at org.apache.openjpa.enhance.PCEnhancer.record(PCEnhancer.java:593)


This is the PCEnhancer launch config:


      <plugin>
        <artifactId>maven-antrun-plugin</artifactId>
        <executions>
          <execution>
            <phase>process-classes</phase>
            <configuration>
              <tasks>
                <path id="cp">
                  <path refid="maven.test.classpath" />
                  <path refid="maven.compile.classpath" />
                  <path refid="maven.runtime.classpath" />
                  <path refid="maven.dependency.classpath" />
                </path>
                <fileset id="enhance.path.ref" dir=".">
                  <include

name="${build.outputDirectory}/org/permacode/patternrepo/domain/entity/*.class" 
/>
                  <include

name="${build.testOutputDirectory}/org/permacode/patternrepo/domain/entity/*.class" />
                </fileset>
                <echo message="Enhancing classes...." />
                <java classname="org.apache.openjpa.enhance.PCEnhancer"
                  classpathref="cp" dir="${build.outputDirectory}"
                  fork="true">
                  <arg line="-properties META-INF/persistence.xml#OpenJpaJDBC" 
/>
                </java>
                <echo message="Enhancing classes for OpenJPA done!" />
              </tasks>
            </configuration>
            <goals>
              <goal>run</goal>
            </goals>
          </execution>
        </executions>
      </plugin>

It seems I might need to reference the entity bean in the fileset 'enhance.path.ref' but I'm not sure how to include a jar with a class in there.









Kevin Sutter on 06/02/09 15:45, wrote:
Hi Adam,
You are right in your thinking not to use the "fall back" enhancement
processing for production use.  It was meant as an easy "out of the box"
experience for simple apps.  It was not meant for production use.  All of
this has been documented in our forums and JIRAs (which you have already
found).

We are doing more investigation into the Java 6 class redefinition support.
This doesn't seem to be 100% complete either, at least for some scenarios.

So, the best bet (and most proven) is to stick with standard PCEnhancement.
This can be done in several ways -- statically during build, or dynamically
via the -javaagent approach or tied into the classloader of a suitable EJB3
container.

In the WebSphere environment, the classloader enhancement process is tied
into both the EJB and Web Containers (same Java EE runtime implementation).
But, it doesn't sound like this linkage is provided by Tomcat.  I have no
direct experience with Tomcat -- just reading your note below.

So, it sounds like your best approach is to do the enhancement during the
build process.  If you are experiencing un-enhanced entities at runtime,
then either your build-time enhancement is not working, or your packaged
application isn't picking up the enhanced classes, or you accidentally have
non-enhanced entities also available via your Tomcat environment.

Because we don't want our WebSphere customers to accidentally use the "fall
back" enhancement, we actually turn this off for OpenJPA within WebSphere.
You can do this with this property in your persistence.xml file:

openjpa.RuntimeUnenhancedClasses = warn

By default, this is set to "supported".  Another value is "unsupported",
which just detects the problem a little earlier.  By using "warn", you still
won't fall into the "fall back" enhancement and you will get some more
helpful messages concerning the entities that have not been enhanced.

I don't have a specific, complete answer to your situation.  But, maybe if
you can experiment a bit with the above information and provide some more
details, we can help get your environment working to your expectations.
Good luck!

Thanks,
Kevin

On Fri, Feb 6, 2009 at 9:05 AM, Adam Hardy <[email protected]>wrote:

I need to enhance the entities in my current project because otherwise with
'fall-back' enhancement, the core functionality of the application cannot be
run, due to StackOverflowErrors (because of the large number of unenhanced
entities that OpenJPA has to deal with, according to JIRA and the mailing
list archives).

I'm running Java 1.6.0_12 so I think I'm right in saying that the runtime
enhancement used by OpenJPA on the unenhanced entities will be Java 6 class
retransformation - but it's causing the issue above.

I have tried specifying the javaagent as a JVM option, but I have some
problems with this in the web server. I'm using tomcat and it looks like I
have to put my complete webapp into tomcat shared directory so that the
enhancement process has the classes available at boot.

My entity beans have a fair amount of encapsulated business logic so there
are a fair number of external utility classes and jar dependencies.

Is there a way to configure the javaagent on a per-website basis for
tomcat?

Secondly I have configured the openjpa-maven-plugin so that it launches the
PCEnhancer during my maven build, but the x*?!"@ app doesn't run with the
build-time enhanced classes.

It just hangs while loading the webapp, when Spring tries to load the
managers (the transaction-wrapped business tier). That's both during
integration testing with JUnit and when deployed in tomcat.

I think that sums up my current situation. Can anyone suggest a way
forward?

regards
Adam



Reply via email to