Google AdSense (text)

hidden logo stop

Moving

거지 같은 이글루스 광고노출 정책이 싫어서,
새 보금자리(http://blog.leocat.kr/)로 이사감.

[JDO, Maven] JDO 사용 시 enhancement Computer & Program

JDO를 사용하기 위해서는 persistence 클래스(DB에 저장된 내용과 매핑되는 클래스)들은 enhancement 작업을 해 주어야 한다. (Bytecode enhancement)

DataNucleus Enhancer 가이드 내용을 보면 다양한 방법으로 enhancement를 수행하는 방법이 나와 있다. 이클립스 플러그인이나 Maven, Ant, 실행 시 옵션 설정 등으로 수행할 수 있는데.. 플러그인은 설치하기 귀찮고 지저분해지는 기분이 싫어서.. Maven을 사용하는 방법을 따라했다. 이러면 이클립스가 없어도 enhancement를 할 수 있으니까..

일단 pom.xml에 다음과 같이 plugin 설정을 추가한다. 가이드를 보면 여러 설정이 있으니 필요하면 설정하고..
<project>
  <build>
    <plugins>
      <plugin>
        <groupId>org.datanucleus</groupId>
        <artifactId>maven-datanucleus-plugin</artifactId>
        <version>${jdo.version}</version>
        <configuration>
          <verbose>true</verbose>
        </configuration>
        <executions>
          <execution>
            <phase>process-classes</phase>
            <goals>
              <goal>enhance</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>


헌데 가이드를 따라하다 보면 분명히 컴파일을 했는데 자꾸 아래와 같은 예외를 뱉으며 실행이 되지 않는다. 어라?? 이상타..
2011. 8. 11 오전 12:08:10 org.datanucleus.store.rdbms.query.JDOQLQuery compileQueryFull
경고: Query for candidates of foo.bar.User and subclasses resulted in no possible candidates
Persistent class "foo.bar.User" has no table in the database, but the operation requires it. Please check the specification of the MetaData for this class.
org.datanucleus.store.exceptions.NoTableManagedException: Persistent class "foo.bar.User" has no table in the database, but the operation requires it. Please check the specification of the MetaData for this class.
    at org.datanucleus.store.mapped.MappedStoreManager.getDatastoreClass(MappedStoreManager.java:405)
    at org.datanucleus.store.rdbms.query.RDBMSQueryUtils.getStatementForCandidates(RDBMSQueryUtils.java:404)
    at org.datanucleus.store.rdbms.query.JDOQLQuery.compileQueryFull(JDOQLQuery.java:858)
    at org.datanucleus.store.rdbms.query.JDOQLQuery.compileInternal(JDOQLQuery.java:340)
    at org.datanucleus.store.query.Query.executeQuery(Query.java:1736)
    at org.datanucleus.store.query.Query.executeWithArray(Query.java:1655)
    at org.datanucleus.api.jdo.JDOQuery.execute(JDOQuery.java:243)
    at foo.dao.impl.UserDaoImpl.loadUserByUserId(UserDaoImpl.java:34)
    at main.Main.main(Main.java:18)


pom.xml에 설정한 플러그인 설정과 Maven Build Lifecycle을 보니 컴파일만 하면 안된다는 것을 알 수 있었다. (나 바보인가바 TㅅT) 플러그인 설정으로 "process-classes" phase에 플러그인의 "enhance" goal을 수행하도록 설정하였다. 헌데.. Build Lifecycle상 process-classes phase는 compile phase 다음이다. 때문에 maven goal을 process-classes로 설정해야 한다. 물론, package처럼 process-classes 다음의 goal을 선택한다면 신경 쓸 필요 없다.
mvn clean process-classes
      또는
mvn clean package
mvn compile process-classes // 등등


핑백

덧글

댓글 입력 영역

Google AdSense (text/image)