gradle - 如何禁用 Gmail Api guava 20
问题描述
我实现了 Gmail API 以从电子邮件中获取一些确认令牌。当您从 git 运行“Gradle run”命令时,会自动使用 Gmail Api 来访问这个 guava 依赖项 guava 20,但是这种依赖项给我带来了一些问题,所以我必须添加 guava 25。
现在我想禁用旧的番石榴依赖 > 但我不知道怎么做。我已经尝试了 Stackoverflow 的所有已知解决方案,但没有任何帮助。最后,我直接从文件夹中删除了该依赖项,但现在我的代码无法编译,所以我不知道该怎么做。
package GmailAPIPackage;
import com.google.api.client.auth.oauth2.Credential;
import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp;
import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver;
import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow;
import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.client.repackaged.org.apache.commons.codec.binary.Base64;
import com.google.api.client.repackaged.org.apache.commons.codec.binary.StringUtils;
import com.google.api.client.util.store.FileDataStoreFactory;
import com.google.api.services.gmail.Gmail;
import com.google.api.services.gmail.GmailScopes;
import com.google.api.services.gmail.model.Label;
import com.google.api.services.gmail.model.ListLabelsResponse;
import com.google.api.services.gmail.model.ListMessagesResponse;
import com.google.api.services.gmail.model.Message;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.security.GeneralSecurityException;
import java.util.Collections;
import java.util.List;
public class GmailQuickstart {
private static final String APPLICATION_NAME = "Gmail API Java Quickstart";
private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();
private static final String TOKENS_DIRECTORY_PATH = "tokens";
/**
* Global instance of the scopes required by this quickstart.
* If modifying these scopes, delete your previously saved tokens/ folder.
*/
private static final List<String> SCOPES = Collections.singletonList(GmailScopes.GMAIL_MODIFY);
private static final String CREDENTIALS_FILE_PATH = "/credentials.json";
/**
* Creates an authorized Credential object.
* @param HTTP_TRANSPORT The network HTTP Transport.
* @return An authorized Credential object.
* @throws IOException If the credentials.json file cannot be found.
*/
private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException {
// Load client secrets.
InputStream in = GmailQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH);
if (in == null) {
throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH);
}
GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in));
// Build flow and trigger user authorization request.
GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES)
.setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH)))
.setAccessType("offline")
.build();
LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build();
return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user");
}
public static void getToken() throws GeneralSecurityException, IOException {
// Build a new authorized API client service.
final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
Gmail service = new Gmail.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT))
.setApplicationName(APPLICATION_NAME)
.build();
// Print the labels in the user's account.
String user = "me";
ListLabelsResponse listResponse = service.users().labels().list(user).execute();
List<Label> labels = listResponse.getLabels();
if (labels.isEmpty()) {
System.out.println("No labels found.");
} else {
System.out.println("Labels:");
for (Label label: labels) {
System.out.printf("- %s\n", label.getName());
}
}
// Access Gmail inbox
Gmail.Users.Messages.List request = service.users().messages().list(user).setQ("from: " + "notification@casinosieger.com");
ListMessagesResponse messagesResponse = request.execute();
request.setPageToken(messagesResponse.getNextPageToken());
// Get ID of the email you are looking for
String messageId = messagesResponse.getMessages().get(0).getId();
Message message = service.users().messages().get(user, messageId).execute();
// Print email body
String emailBody = StringUtils
.newStringUtf8(Base64.decodeBase64(message.getPayload().getParts().get(0).getParts().get(1).getBody().getData()));
System.out.println("Email body : " + emailBody);
}
}
RegFirstCase 主类
package GmailAPIPackage;
import java.io.IOException;
import org.openqa.selenium.JavascriptExecutor;
import java.security.GeneralSecurityException;
import java.sql.DriverManager;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.ThreadLocalRandom;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.support.ui.WebDriverWait;
import static org.openqa.selenium.support.ui.ExpectedConditions.presenceOfElementLocated;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.repackaged.org.apache.commons.codec.binary.Base64;
import com.google.api.client.repackaged.org.apache.commons.codec.binary.StringUtils;
import com.google.api.services.gmail.Gmail;
import com.google.api.services.gmail.model.ListMessagesResponse;
import com.google.api.services.gmail.model.Message;
public class RegFirstCase extends GmailQuickstart{
public static void main(String[] args) throws GeneralSecurityException, IOException, InterruptedException {
System.setProperty("webdriver.chrome.driver", "C:\\Program Files\\Selenium\\selenium-java-3.141.59\\chromedriver.exe");
WebDriver driver = new ChromeDriver();
driver.get("https:\\www.casinosieger.com\\en\\register");
driver.manage().window().maximize();
int i = ThreadLocalRandom.current().nextInt(100000, 1000000);
driver.findElement(By.id("username")).sendKeys("Stefan" + i);
driver.findElement(By.id("email")).sendKeys("stefan.t+" +i+ "@condor-gaming.com");
driver.findElement(By.id("password")).sendKeys("Gordana1994");
Actions act = new Actions(driver);
act.moveToElement(driver.findElement(By.id("terms"))).click().perform();
driver.findElement(By.id("is_of_legal_age")).click();
driver.findElement(By.id("register")).click();
Thread.sleep(5000);
GmailQuickstart.getToken();
System.out.println("Stigao dovde");
Pattern p = Pattern.compile("(https)://([\\w_-]+(?:(?:\\.[\\w_-]+)+))([[\\w+,@?^=%&:/~+#-]*[\\w@?^=%&/~+#-])?(token)(\\=)([^\"]+)");
Matcher m = p.matcher("token=(.*)");
boolean b = m.matches();
System.out.println(b);
}
}
摇篮文件
apply plugin: 'java'
apply plugin: 'application'
mainClassName = 'GmailQuickstart'
sourceCompatibility = 1.8
targetCompatibility = 1.8
version = '1.0'
repositories {
mavenCentral()
google()
}
dependencies {
implementation 'com.google.api-client:google-api-client:1.24.1'
implementation 'com.google.oauth-client:google-oauth-client-jetty:1.24.1'
implementation 'com.google.apis:google-api-services-gmail:v1-rev95-1.24.1'
}
configurations.all {
exclude group: 'com.google.guava:guava-jdk5:20.0' , module: 'guava-jdk5'
}
未直接从文件夹中删除 guava 20 时的错误消息:
Exception in thread "main" java.lang.NoSuchMethodError: 'com.google.common.util.concurrent.SimpleTimeLimiter com.google.common.util.concurrent.SimpleTimeLimiter.create(java.util.concurrent.ExecutorService)'
at org.openqa.selenium.net.UrlChecker.<init>(UrlChecker.java:62)
at org.openqa.selenium.remote.service.DriverService.waitUntilAvailable(DriverService.java:197)
at org.openqa.selenium.remote.service.DriverService.start(DriverService.java:188)
at org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:79)
at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:552)
at org.openqa.selenium.remote.RemoteWebDriver.startSession(RemoteWebDriver.java:213)
at org.openqa.selenium.remote.RemoteWebDriver.<init>(RemoteWebDriver.java:131)
at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:181)
at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:168)
at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:123)
at GmailAPIPackage.RegFirstCase.main(RegFirstCase.java:33)
运行 gradle 依赖项后的错误消息:
C:\Users\Stefan.T\Desktop\GmailApi>gradle dependencies
Starting a Gradle Daemon, 1 incompatible and 1 stopped Daemons could not be reused, use --status for details
FAILURE: Build failed with an exception.
* Where:
Build file 'C:\Users\Stefan.T\Desktop\GmailApi\build.gradle' line: 14
* What went wrong:
A problem occurred evaluating root project 'GmailApi'.
> Could not find method compile() for arguments [com.google.api-client:google-api-client:1.23.0] on object of type org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler.
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
* Get more help at https://help.gradle.org
BUILD FAILED in 27s
C:\Users\Stefan.T\Desktop\GmailApi>
解决方案
我已经找到了一个解决方案,我从头开始创建了一个新的 Gradle 项目(不是通过 Gmail 说明从这里:https ://developers.google.com/gmail/api/quickstart/java#prerequisites 现在一切都按预期工作. 我只是想补充一点,我不明白为什么 Gmail 没有更新他们的说明(他们使用了很多不是最新的东西),因此我们正在失去神经:D
推荐阅读
- google-app-maker - 如何根据电子邮件发送成功更新字段
- java - SpringBoot 为soap请求生成端点映射
- javascript - DataTables / Checkboxes Plugin - 如何返回选中的复选框数量
- apache - 在 Windows 上的 apache http 服务器上重写 URL
- windows - 如何让 Oracle vm VirtualBox 6.0 和 wsl 同时工作
- vue.js - 前面的点
- docker - 如何在集群配置中将 kafka 主题持久化到主机重启之外
- rust - 如何解决“冲突的生命周期要求”
- java - Spring - 带有 Mock 的单元测试 - 如何在服务单元测试中模拟自定义收集器
- webpack - 如何通过 webpack 文件加载器加载 json?