google-app-engine - 将 scala 类添加到 DataNucleus 增强器 CLASSPATH

标签 google-app-engine scala datanucleus gae-eclipse-plugin

我正在编写一个 Google App Engine Web 应用程序,并希望在服务器端使用 Scala。我正在使用 Eclipse 和 Google App Engine 插件。但是,一旦我将空的 Scala 类源文件添加到我的项目中,DataNucleus 增强器就会发出警告:

SEVERE: Class "com.my.package.UserAccount" was not found in the CLASSPATH. Please check your specification and your CLASSPATH.

我最终会抽出时间让这个类持久化,但我想首先消除这个错误。

到目前为止,我已经添加了 Scala Nature,并尝试清理项目并重新启动 Eclipse,但我总是收到增强器发出的相同警告。

关于如何让增强器成功运行有什么想法吗?

最佳答案

过去几天我一直在努力解决这个问题。 Scala 类上的 datanucleus 增强器抛出的“找不到类”错误是因为增强器运行时 scala-library.jar 文件不在类路径中。我找到了两种解决方案:

  1. 简单但复杂:将 scala-library.jar 复制到 eclipse/plugins 中包含增强器的文件夹。对我来说,目前是:/opt/eclipse/plugins/com.google.appengine.eclipse.sdkbundle_1.5.5.r36v201110112027/appengine-java-sdk-1.5.5/lib/tools/orm

  2. 在项目属性中关闭增强器构建器并创建一个 ant 文件以手动运行它。然后您可以正确控制类路径。我真的很难将 scala-library 放入类路径中,因此放弃并将其复制到与我的 datanucleus jar 相同的文件夹中。如果有人感兴趣的话,我的 Ant 文件是:

<project name="DataNucleusEnhancer" default="enhance" basedir="."> 
    <property name="base.dir" location="/home/steve/Projects/DNProject"/>
    <property name="datanucleus.libs" location="/home/steve/Projects/Jar Libraries/datanucleusjars"/>
    <property name="sdk.dir" location="/opt/eclipse/plugins/com.google.appengine.eclipse.sdkbundle_1.5.5.r36v201110112027/appengine-java-sdk-1.5.5"/>
    <property name="classes.dir" location="${base.dir}/war/WEB-INF/classes/"/>
    <property name="entities.dir" location="${base.dir}/war/WEB-INF/classes/packagenamehere/entities"/>

    <path id="enhancer.classpath">
        <fileset dir="${datanucleus.libs}" includes="*.jar" excludes="" />
        <fileset dir="${sdk.dir}/lib/user" includes="*.jar" />
    </path>

    <target name="enhance" description="DataNucleus enhancement">
        <taskdef name="datanucleusenhancer" classpathref="enhancer.classpath" classname="org.datanucleus.enhancer.tools.EnhancerTask" />
        <datanucleusenhancer dir="${classes.dir}" failonerror="true" verbose="true">
            <fileset dir="${entities.dir}" includes="**/*.class" />
            <classpath>
            <path location="${base.dir}/war/WEB-INF/classes/"/>
                <path refid="enhancer.classpath"/>
            </classpath>
        </datanucleusenhancer>
    </target>

</project>

在测试中我还发现,如果我没有命名空间,增强器就不愿意增强类。我还担心我现在需要管理 scala-library.jar 的副本,以确保它与 scala eclipse 插件中的相同。如果gae插件能正常使用就更好了!

关于google-app-engine - 将 scala 类添加到 DataNucleus 增强器 CLASSPATH,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8013391/

相关文章:

java - 如何将 pdf 文件存储在谷歌云存储上?

eclipse - 如何在eclipse中添加sbteclipse插件

scala - 窥视Scala Actor 邮箱的最佳方法

java - 将 DataNucleus DB 引擎 (Neodatis) 升级到最新版本会生成 ClassCastException

java - datanucleus jdo 3.1.2 迁移到 4.x

google-app-engine - 谷歌应用引擎 : reference property that references to 4 models or more

java - 在应用程序引擎中过滤记录 (Java)

scala - 使用 elasticsearch-spark 连接器从 spark 读取 ES : all the fields are returned

java - GAE、JPA、XG-transactions、太多实体组异常

google-app-engine - 无法连接到 Google App Engine 上的 Redis 服务器