[英]Java Build Error when adding javax.smartcardio to project
我正在嘗試向我們的一個應用程序中添加一些簡單的智能卡讀卡器功能,但不斷出現無法弄清的構建錯誤,因此我正在尋找輸入或任何可以找到的建議,這些都將有助於我在新類之一中導入javax.smartcardio之后進行編譯的項目。
我最初用一個字符串解析方法和一個main方法創建了一個簡單的類。 作為一個獨立的項目,我可以很好地運行該類而不會出錯,並且讀卡器和卡的所有預期信息都可以按預期通過System.out打印到控制台,因此我認為代碼沒有任何問題我已經從這個早期測試項目帶到了我的項目中。
但是,既然我已經將smartcardio導入了新類,那么我的項目將無法編譯。 我嘗試按照此處其他幾篇文章中的建議刪除並重新添加JRE系統庫,但是我認為這可能是一個不同的問題。 編譯時,即使我反復檢查並且jar在JRE文件夾中,編譯器似乎也無法識別或找不到rt.jar。
這是錯誤,我們非常感謝您的幫助。 讓我知道是否需要更多信息。
[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();
}
}
}
謝謝Zoran Regvart! 盡管您沒有真正提供答案,但您還是通過看到自己的愚蠢錯誤幫助了我!
我已將SwipeCardUtil類添加到項目中的錯誤util文件夾中! 通過將其從客戶端util文件夾移到服務器util文件夾,我能夠編譯項目並繼續工作。 謝謝你睜開眼睛!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.