我的公司使用Perforce进行版本控制,并且我编写了使用p4java自动使用Perforce的软件。我遇到了一个问题,我的代码无法连接到Perforce服务器,即使我传递了有效信息以便在我的计算机上使用p4tickets文件。
首先,我通过运行" p4 login"来登录perforce以获得p4ticket,它创建了〜/ .p4tickets文件。但是当我运行使用p4java使用p4ticket文件连接的程序时,它返回null。
AuthTicket auth = AuthTicketsHelper.getTicket(username, serverAddr, p4TicketsFilePath);
// auth == null
我已经仔细检查过,我传入的用户名与我使用的#P4; p4 login"时的$ P4USER环境变量匹配,以及该serverAddr与主机名匹配这是我的$ P4PORT引用的。 p4TicketsFilePath也存在,并且是具有我的票证的.p4tickets文件的正确路径,该文件未过期。我正在寻找getTicket仍然返回null的原因。
答案 0 :(得分:0)
您可以通过从AuthTicketsHelper复制源代码并插入print语句来调试此问题。这是我的记录器:
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地址。