我使用Google表格API查询Google上的电子表格。从Eclipse中运行时代码运行正常。但是,当项目打包到jar(例如,spreadsheets-api.jar)并从另一个项目中用作maven依赖项时,我遇到了以下方法调用的问题:
public static Sheets createService() throws GoogleServiceInitException {
if (properties == null)
init();
URL keyfile = GoogleSpreadSheetService.class.getResource(getValue(PropertyEnum.PRIVATEKEY_FILE));
if (keyfile == null)
throw new GoogleServiceInitException("Missing private key file");
Credential credential;
try {
credential = new GoogleCredential.Builder().setTransport(HTTP_TRANSPORT).setJsonFactory(JSON_FACTORY)
.setServiceAccountId(getValue(PropertyEnum.SERVICE_ACCOUNT_ID))
.setServiceAccountPrivateKeyFromP12File(Paths.get(keyfile.toURI()).toFile())
.setServiceAccountScopes(SCOPES).build();
return new Sheets.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential).setApplicationName(APPLICATION_NAME)
.build();
} catch (GeneralSecurityException | IOException | URISyntaxException e) {
logger.error(APGeneralUtilities.stacktraceToString(e));
throw new GoogleServiceInitException(e.getMessage());
}
}
问题在于方法setServiceAccountPrivateKeyFromP12File
,它只需要java.io.File
作为参数。因此,当我尝试通过将jar中的嵌入式P12文件作为URL引用来访问此文件,然后使用此代码行Paths.get(keyfile.toURI()).toFile()
将其转换为文件时,代码会弹出java.nio.file.FileSystemNotFoundException
问题非常清楚。我需要将P12文件称为流,我可以通过使用Class.getResourceAsStream()或其他替代方法来实现,但Google的凭据构建器仅将文件作为参数。
我现在有什么选择?我看到它的方式,使用sheet api,我只需要获取流,将其复制到临时文件,然后将该文件的路径作为参数提供给Credentials构建器,最后删除临时文件一切都完成了。有没有更简单的方法来解决这个问题?