【问题标题】:How to extend a class that's not in my project如何扩展不在我的项目中的类
【发布时间】:2012-09-14 19:39:44
【问题描述】:

我正在尝试为xwiki 编写一个custom authentication 类。

我有一个项目,其中编写了身份验证机制,如果有人试图访问 xwiki,我希望它使用 xwiki 自定义身份验证将他们重定向到我项目的登录页面。

我正在尝试与我的项目分开编写一个类并与 xwiki 分开,将其打包为一个 jar 并将其放入 xwiki 项目的 xwiki WEB-INF/lib 文件夹中,因为这就是说明所说的xwiki 自定义身份验证。

问题是,我需要编写的类导入了一些 xwiki 类。如果我用这些导入编写一个单独的类,它将无法正确编译。

如果它是一个需要进入 xwiki 的 WEB-INF/lib 文件夹的单独类,我应该如何创建一个扩展某些 xwiki 类的类?

这是某人发布https://www.box.com/shared/9kamt5d9c5 的示例。

简单示例

package my.xwiki.custom.authentication;

import java.io.*;
import com.xpn.xwiki.XWikiContext;
import com.xpn.xwiki.XWikiException;
import com.xpn.xwiki.user.api.XWikiUser;
import com.xpn.xwiki.user.impl.xiki.XWikiAuthServiceImpl;


public class XWikiSSOImpl extends XWikiAuthServiceImpl {

    @Override
    public XWikiUser checkAuth(XWikiContext context) throws XWikiException {
        System.out.println("we actually in checkAuth?");
    }
}

当我将我的 jar 文件添加到我的 xwiki 并运行它时,我收到以下错误:

Detailed information:

    Error number 0 in 11: Uncaught exception
Wrapped Exception: Unresolved compilation problems: 
    The import com.xpn cannot be resolved
    The import com.xpn cannot be resolved
    The import com.xpn cannot be resolved
    The import com.xpn cannot be resolved
    XWikiAuthServiceImpl cannot be resolved to a type
    XWikiUser cannot be resolved to a type
    XWikiContext cannot be resolved to a type
    XWikiException cannot be resolved to a type

com.xpn.xwiki.XWikiException: Error number 0 in 11: Uncaught exception
Wrapped Exception: Unresolved compilation problems: 
    The import com.xpn cannot be resolved
    The import com.xpn cannot be resolved
    The import com.xpn cannot be resolved
    The import com.xpn cannot be resolved
    XWikiAuthServiceImpl cannot be resolved to a type
    XWikiUser cannot be resolved to a type
    XWikiContext cannot be resolved to a type
    XWikiException cannot be resolved to a type

    at com.xpn.xwiki.web.XWikiAction.execute(XWikiAction.java:254)
    at com.xpn.xwiki.web.XWikiAction.execute(XWikiAction.java:116)
    at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)
    at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
    at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
    at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at com.xpn.xwiki.web.ActionFilter.doFilter(ActionFilter.java:120)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.xwiki.wysiwyg.server.filter.ConversionFilter.doFilter(ConversionFilter.java:144)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at com.xpn.xwiki.plugin.webdav.XWikiDavFilter.doFilter(XWikiDavFilter.java:66)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.xwiki.container.servlet.filters.internal.SavedRequestRestorerFilter.doFilter(SavedRequestRestorerFilter.java:208)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.xwiki.container.servlet.filters.internal.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:111)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
    at java.lang.Thread.run(Thread.java:662)
Caused by: java.lang.Error: Unresolved compilation problems: 
    The import com.xpn cannot be resolved
    The import com.xpn cannot be resolved
    The import com.xpn cannot be resolved
    The import com.xpn cannot be resolved
    XWikiAuthServiceImpl cannot be resolved to a type
    XWikiUser cannot be resolved to a type
    XWikiContext cannot be resolved to a type
    XWikiException cannot be resolved to a type

    at my.xwiki.custom.authentication.XWikiSSOImpl <init>(XWikiSSOImpl.java:4)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at java.lang.Class.newInstance0(Class.java:355)
    at java.lang.Class.newInstance(Class.java:308)
    at com.xpn.xwiki.XWiki.getAuthService(XWiki.java:5288)
    at com.xpn.xwiki.XWiki.checkAuth(XWiki.java:4090)
    at com.xpn.xwiki.user.impl.xwiki.XWikiRightServiceImpl.checkAccess(XWikiRightServiceImpl.java:205)
    at com.xpn.xwiki.XWiki.checkAccess(XWiki.java:4103)
    at com.xpn.xwiki.XWiki.prepareDocuments(XWiki.java:5128)
    at com.xpn.xwiki.web.XWikiAction.execute(XWikiAction.java:179)
    ... 34 more

【问题讨论】:

  • 您要扩展的基类和要导入的类是否都在类路径/编译路径上?如果他们不是,我预计他们会失败。
  • 请添加代码 sn -p 突出显示错误
  • 您需要将该类添加到您的项目中或将该类的存根添加到您的项目中,但前提是您必须这样做。
  • @corsiKa 不,我认为它们不在同一个类路径上。
  • 当我尝试执行 export->jar 时,它显示“导出时出现编译错误”。

标签: java xwiki


【解决方案1】:

根据提供的链接,您似乎没有丢失任何导入,并假设您没有任何明显的语法错误,那么它指向您的开发环境。一个典型的解决方案是使用包的路径设置 CLASSPATH 变量,但根据我的经验,这很容易出错。

如果您使用的是 Eclipse,请右键单击您的项目名称并选择属性。在属性对话框中,单击左侧的“Java Build Path”。在“Java 构建路径”属性中,单击库选项卡。您想单击“添加外部 Jar...”按钮,您将在其中指定 xwiki jar 的路径。

【讨论】:

  • 好的,我下载了 xwiki.war 文件。 WEB-INF/lib 文件夹中有很多 xwiki jar 文件。我如何知道哪些对应于我要导入的文件?
  • 在这种情况下,您可能需要从 war 文件中提取所需的 .class 文件。 war 文件类似于 jar,但内部具有不同的目录结构。两者都是 zip 文件。下载 7zip,用它打开 war,查找包含 'com.xpn.xwiki' 路径的根目录并将其复制到本地驱动器。您现在可以 jar 这个新目录或将其作为类文件夹包含在您的项目中。 注意: 一些供应商会要求您获得许可证或许可才能执行此操作(即 Oracle),但使用开源不会有任何问题(即 Apache)
  • 我只是将所有 jar 文件复制到我的构建路径,然后突出显示导入行并执行“打开声明”,它会告诉您它来自哪里。然后我只是从构建路径中删除了所有我需要的路径。
【解决方案2】:

要编译一个类,编译器需要所有引用类(包括超类)的定义。它可以使用已经编译的类(作为 .class 文件或来自 JAR 文件),或者从源代码编译这些类。由于您不想编译 xwiki 类,因此您需要编译前者。

因此,您需要将包含这些类的 jar 文件添加到您的类路径中。如何做到这一点取决于您如何调用编译器或您使用的 IDE。使用 Eclipse,您可以右键单击项目 -> 构建路径 -> 添加外部档案。对于javac,您可以使用-cp 选项。

【讨论】:

  • 我正在使用 Eclipse。我认为您的意思是“添加外部类文件夹”?
  • 上下文菜单中没有名为“添加外部类文件夹”的选项。您是否在上下文菜单中选择了“配置构建路径”?在该弹出窗口中,将使用“添加外部 JAR”来添加带有类的 JAR 文件。 “外部类文件夹”是指如果您有一个包含类文件的目录,即解压缩的 JAR 文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-09
  • 2011-02-09
  • 2019-05-14
  • 1970-01-01
  • 2020-01-11
  • 1970-01-01
  • 2011-07-22
相关资源
最近更新 更多