我的公司使用Perforce进行版本控制,我正在编写使用p4java自动化Perforce使用的软件。我遇到了一个问题,即使我正在传递有效信息以使用计算机上的p4tickets文件,我的代码也无法连接到Perforce服务器。
首先,我登录以通过运行"p4login"来获得p4ticket,该操作创建了~/.p4ctickets文件。但是,当我运行使用p4java使用p4ticket文件进行连接的程序时,它会返回null。
AuthTicket auth = AuthTicketsHelper.getTicket(username, serverAddr, p4TicketsFilePath);
// auth == null
我已经仔细检查了我传递的用户名是否与我使用"p4login"时的$P4USER环境变量匹配,以及serverAddr是否与我的$P4PORT引用的主机名匹配。p4TicketsFilePath也存在,并且是p4tickets文件的正确路径,该文件包含我的票证,但尚未过期。我正在寻找getTicket仍然返回null的原因。
您可以通过从AuthTicketsHelper复制源代码并插入打印语句来调试此问题。这是我的记录器:
private static final Logger logger = LoggerFactory.getLogger(YourClass.class);
(如果您没有记录器,您可以使用String.format("…%s…%s")执行System.out.println()。)然后,复制这个代码。
AuthTicket auth;
{
AuthTicket foundTicket = null;
String serverAddress = serverAddr;
String ticketsFilePath = p4TicketsFilePath;
String userName = username;
if (serverAddress != null) {
logger.info("P4TICKETS 1");
if (serverAddress.indexOf(':') == -1) {
serverAddress += "localhost:" + serverAddress;
logger.info("P4TICKETS 2");
}
for (AuthTicket ticket : AuthTicketsHelper.getTickets(ticketsFilePath)) {
logger.info("P4TICKETS 3 {} - {} - {} - {}", serverAddress, ticket.getServerAddress(), userName, ticket.getUserName());
if (serverAddress.equals(ticket.getServerAddress())
&& (userName == null || userName.equals(ticket
.getUserName()))) {
logger.info("P4TICKETS 4");
foundTicket = ticket;
break;
}
}
logger.info("P4TICKETS 5");
}
auth = foundTicket;
}
按照输出中的代码路径查看出了什么问题。在我的例子中,服务器名称是代码中的主机名,但我的.p4tickets文件有一个服务器名称的IP地址。