【问题标题】:Java Build Error when adding javax.smartcardio to project将 javax.smartcardio 添加到项目时出现 Java 构建错误
【发布时间】:2014-11-10 17:48:47
【问题描述】:

我正在尝试将一些简单的智能卡读卡器功能添加到我们的一个应用程序中,但我不断收到我无法弄清楚的构建错误,因此我正在寻找输入或任何我能找到的建议以帮助在其中一个新类中导入 javax.smartcardio 后,我可以编译项目。

我最初创建了一个简单的类,其中包含一个字符串解析方法和一个主方法。作为一个独立项目,我可以很好地运行该类而不会出错,并且来自读卡器和卡的所有预期信息都按预期通过 System.out 打印到控制台,所以我认为代码没有任何问题我从这个早期的测试项目中带到了我的项目中。

但是现在我已经将 smartcardio 导入到新类中,我的项目将无法编译。我已尝试按照此处其他几篇文章中的建议删除和重新添加 JRE 系统库,但我认为这可能是一个不同的问题。编译时,似乎编译器无法识别或找不到 rt.jar,即使我反复检查并且 jar 存在于 JRE 文件夹中。

这是错误,非常感谢任何帮助。如果需要更多信息,请告诉我。

[INFO] --- maven-antrun-plugin:1.7:run (compilegwt) @ hwslqc ---
[INFO] Executing tasks

main:
     [echo] GWT compilation: hwslqc
     [java] Compiling module com.prusa.hwslqc.hwslqc
     [java]    [ERROR] An internal compiler exception occurred
     [java] com.google.gwt.dev.jjs.InternalCompilerException: Failed to get JNode
     [java]     at com.google.gwt.dev.jjs.impl.TypeMap.get(TypeMap.java:140)
     [java]     at com.google.gwt.dev.jjs.impl.TypeMap.get(TypeMap.java:71)
     [java]     at com.google.gwt.dev.jjs.impl.BuildTypeMap.getType(BuildTypeMap.java:730)
     [java]     at com.google.gwt.dev.jjs.impl.BuildTypeMap.access$000(BuildTypeMap.java:99)
     [java]     at com.google.gwt.dev.jjs.impl.BuildTypeMap$BuildDeclMapVisitor.visit(BuildTypeMap.java:195)
     [java]     at org.eclipse.jdt.internal.compiler.ast.LocalDeclaration.traverse(LocalDeclaration.java:237)
     [java]     at org.eclipse.jdt.internal.compiler.ast.Block.traverse(Block.java:127)
     [java]     at org.eclipse.jdt.internal.compiler.ast.TryStatement.traverse(TryStatement.java:853)
     [java]     at org.eclipse.jdt.internal.compiler.ast.MethodDeclaration.traverse(MethodDeclaration.java:239)
     [java]     at org.eclipse.jdt.internal.compiler.ast.TypeDeclaration.traverse(TypeDeclaration.java:1239)
     [java]     at org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration.traverse(CompilationUnitDeclaration.java:687)
     [java]     at com.google.gwt.dev.jjs.impl.BuildTypeMap.createPeersForNonTypeDecls(BuildTypeMap.java:637)
     [java]     at com.google.gwt.dev.jjs.impl.BuildTypeMap.exec(BuildTypeMap.java:514)
     [java]     at com.google.gwt.dev.jjs.impl.BuildTypeMap.exec(BuildTypeMap.java:523)
     [java]     at com.google.gwt.dev.jjs.JavaToJavaScriptCompiler.precompile(JavaToJavaScriptCompiler.java:599)
     [java]     at com.google.gwt.dev.jjs.JavaScriptCompiler.precompile(JavaScriptCompiler.java:33)
     [java]     at com.google.gwt.dev.Precompile.precompile(Precompile.java:284)
     [java]     at com.google.gwt.dev.Precompile.precompile(Precompile.java:233)
     [java]     at com.google.gwt.dev.Precompile.precompile(Precompile.java:145)
     [java]     at com.google.gwt.dev.Compiler.run(Compiler.java:232)
     [java]     at com.google.gwt.dev.Compiler.run(Compiler.java:198)
     [java]     at com.google.gwt.dev.Compiler$1.run(Compiler.java:170)
     [java]     at com.google.gwt.dev.CompileTaskRunner.doRun(CompileTaskRunner.java:88)
     [java]     at com.google.gwt.dev.CompileTaskRunner.runWithAppropriateLogger(CompileTaskRunner.java:82)
     [java]     at com.google.gwt.dev.Compiler.main(Compiler.java:177)
     [java]       [ERROR] <no source info>: public final class javax.smartcardio.TerminalFactory
     [java]     extends java.lang.Object
     [java] /*   fields   */
     [java] private static final [unresolved] java.lang.String PROP_NAME
     [java] private static final [unresolved] java.lang.String defaultType
     [java] private static final [unresolved] javax.smartcardio.TerminalFactory defaultFactory
     [java] private final [unresolved] Unresolved type javax.smartcardio.TerminalFactorySpi spi
     [java] private final [unresolved] Unresolved type java.security.Provider provider
     [java] private final [unresolved] java.lang.String type
     [java] /*   methods   */
     [java] [unresolved] private void <init>(Unresolved type javax.smartcardio.TerminalFactorySpi, Unresolved type java.security.Provider, java.lang.String) 
     [java] public static javax.smartcardio.TerminalFactory getDefault() 
     [java] [unresolved] public static java.lang.String getDefaultType() 
     [java] [unresolved] public static javax.smartcardio.TerminalFactory getInstance(java.lang.String, java.lang.Object) throws java.security.NoSuchAlgorithmException
     [java] [unresolved] public static javax.smartcardio.TerminalFactory getInstance(java.lang.String, java.lang.Object, java.lang.String) throws java.security.NoSuchAlgorithmException, Unresolved type java.security.NoSuchProviderException
     [java] [unresolved] public static javax.smartcardio.TerminalFactory getInstance(java.lang.String, java.lang.Object, Unresolved type java.security.Provider) throws java.security.NoSuchAlgorithmException
     [java] [unresolved] public Unresolved type java.security.Provider getProvider() 
     [java] [unresolved] public java.lang.String getType() 
     [java] public javax.smartcardio.CardTerminals terminals() 
     [java] [unresolved] public java.lang.String toString() 
     [java] /*   members   */
     [java] Unresolved type javax.smartcardio.TerminalFactory$NoneCardTerminals
     [java] Unresolved type javax.smartcardio.TerminalFactory$NoneFactorySpi
     [java] Unresolved type javax.smartcardio.TerminalFactory$NoneProvider
     [java] 
     [java] 
     [java] 
     [java]       [ERROR] at SwipeCardUtil.java(48): TerminalFactory factory = TerminalFactory.getDefault();
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 38.721s

这是导致第 48 行编译错误的非常简单的类:

package com.prusa.hwslqc.client.ui.util;

import java.util.List;

import javax.smartcardio.Card;
import javax.smartcardio.CardException;
import javax.smartcardio.CardTerminal;
import javax.smartcardio.TerminalFactory;



/**
 * @author SWESTF01
 *
 */
@SuppressWarnings("restriction")
public class SwipeCardUtil 
{

    /**
     * @param theBytes
     * @return theByteArray as a hex string
     */
    public static String byteArrayToHexString(byte[] theBytes)          
    {             
        StringBuffer sb = new StringBuffer(theBytes.length * 2);             

        for (int i = 0; i < theBytes.length; i++) 
        {               
            int byteRead = theBytes[i] & 0xff;               
            if (byteRead < 16) 
            {                 
                sb.append('0');               
            }               
            sb.append(Integer.toHexString(byteRead));          
        }             
        return sb.toString().toUpperCase();          
     }

    /**
     */
    @SuppressWarnings("restriction")
    public static void readCard()
    {                 
        try 
        {
            // Show the list of available terminals
            TerminalFactory factory = TerminalFactory.getDefault();

            List<CardTerminal> terminals = factory.terminals().list();
            if (terminals.size() == 0) {
                System.out.println("No terminals found.");
                return;
            }
            System.out.println("Terminal: " + terminals.get(0).getName());

            // Get the first terminal in the list
            CardTerminal terminal = terminals.get(0);
            boolean cardHasBeenRead = false;

            if(!terminal.isCardPresent())
            {
                System.out.println("Please insert a card.");
            }

            //8 hours = 28800000
            //1 day = 86400000
            while(terminal.waitForCardPresent(86400000))
            {

                if(!cardHasBeenRead)
                {
                    // Establish a connection with the card using
                    // "T=0", "T=1", "T=CL" or "*"
                    Card card = terminal.connect("*");

                    System.out.println("Card: " + card);

                    // Get ATR
                    byte[] baATR = card.getATR().getBytes();

                    System.out.println("ATR: " + SwipeCardUtil.byteArrayToHexString(baATR));

                    // Disconnect
                    // true: reset the card after disconnecting card.
                    card.disconnect(true);
                    cardHasBeenRead = true;
                }

                if(!terminal.isCardPresent())
                {
                    cardHasBeenRead = false;
                    System.out.println("Please insert a card.");
                }
             }
        } 
        catch (CardException ex) {
            System.out.println("Please connect a Card Reader and restart the program.");
            ex.printStackTrace();
        }
    } 
}

【问题讨论】:

  • 你能从 maven-antrun-plugin 发布相关的 ant 任务吗?从输出看来,您似乎正在尝试使用 GWT 编译器编译 SwipeCardUtil,但这是行不通的,因为客户端(在浏览器中)不存在 SmartCard API。因此,您无法从 JavaScript 调用它。也许如果这是您的意图,您必须将依赖 SmartCard API 的代码打包到一个小程序中以使其在浏览器中运行,并使用实时连接从 JavaScript 调用。

标签: java eclipse maven build smartcard


【解决方案1】:

谢谢 Zoran Regvart!尽管您没有真正提供答案,但您通过看到我自己的愚蠢错误帮助我到达了那里!

我已将 SwipeCardUtil 类添加到项目中的错误 util 文件夹中!通过将其从客户端 util 文件夹移动到服务器端 util 文件夹,我能够编译该项目并继续我的工作。谢谢你让我大开眼界!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-31
    • 1970-01-01
    • 2019-08-02
    • 1970-01-01
    • 2012-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多