如何在 Eclipse 中修复 jgit 的 class 的 java.lang.ClassNotFoundException
How to fix java.lang.ClassNotFoundException of jgit's class in Eclipse
首先:我知道关于这个主题有很多问题,但我遇到的情况与标准完全不同,我无法解决它。
现在我正在使用 Eclipse,并且我正在使用 2 个外部库:json 和 jgit。
问题是:json 有效,但 jgit 无效,为什么?
当我 运行 我的代码是
`Exception in thread "main" java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory
at org.eclipse.jgit.util.SystemReader.<clinit>(SystemReader.java:55)
at org.eclipse.jgit.lib.BaseRepositoryBuilder.readEnvironment(BaseRepositoryBuilder.java:363)
at org.eclipse.jgit.api.InitCommand.call(InitCommand.java:58)
at org.eclipse.jgit.api.CloneCommand.init(CloneCommand.java:267)
at org.eclipse.jgit.api.CloneCommand.call(CloneCommand.java:173)
at GitHub.GitHubAPI.init(GitHubAPI.java:35)
at GitHub.GitHubAPI.main(GitHubAPI.java:73)
Caused by: java.lang.ClassNotFoundException: org.slf4j.LoggerFactory
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:602)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
... 7 more
`
在网上看了一下,发现这个错误是因为运行时的JVM找不到我正在使用的class,但是我不明白如何解决这个问题。
奇怪的是,在另一个 class 中,我使用了 json 库,但没有给我任何问题。
对于这两个库,我所做的是转到“配置构建路径”,将 JAR 添加到“模块路径”,并将这些 JAR 的路径作为“类路径”中的变量添加。
这是我的代码,如果你需要的话。
package GitHub;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
//import java.util.logging.Logger;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.ListBranchCommand.ListMode;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.api.errors.InvalidRemoteException;
import org.eclipse.jgit.api.errors.TransportException;
import org.eclipse.jgit.lib.Ref;
//import org.eclipse.jgit.revwalk.RevCommit;
public class GitHubAPI {
// private static Logger myLogger = Logger.getLogger("InfoLogging");
private String projNameMin;
private final String url = "https://github.com/apache/";
private Git git;
private String repoLocalPath;
public GitHubAPI(String projectName) {
this.projNameMin = projectName.toLowerCase();
this.repoLocalPath = "./"+projNameMin+"Repo";
}
public void init() {
String uri = url + projNameMin + ".git";
try {
git = Git.cloneRepository().setURI(uri).setDirectory(new File(repoLocalPath)).call(); //this line triggers the error
} catch (InvalidRemoteException e) {
e.printStackTrace();
} catch (TransportException e) {
e.printStackTrace();
} catch (GitAPIException e) {
e.printStackTrace();
}
}
public ArrayList<GitCommit> getCommits(){
ArrayList<GitCommit> commits = new ArrayList<GitCommit>();
// Iterable<RevCommit> commitsLog = null;
try {
// boolean head = false;
List<Ref> branches = git.branchList().setListMode(ListMode.ALL).call();
for (Ref branch: branches) {
String branchName = branch.getName();
System.out.println(branchName);
if (branchName.startsWith("refs/heads/")) {
// head = true;
}
}
} catch (GitAPIException e) {
e.printStackTrace();
}
return commits;
}
public static void main(String[] args) {
GitHubAPI githubapi = new GitHubAPI("VCL");
githubapi.init();
githubapi.getCommits();
}
}
有人知道如何解决这个问题吗?
直截了当,错误是由于缺少 slf4j 依赖项造成的。
如果是maven项目,那么在pom.xml中添加这些依赖:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<!-- This is used for slf4j binding with log4j -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
<scope>test</scope>
</dependency>
或者通过从下面的链接下载将 jar 添加到类路径中。
Slf4j API - https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.25/slf4j-api-1.7.25.jar
Slf4j-Log4j12 - https://repo1.maven.org/maven2/org/slf4j/slf4j-log4j12/1.7.25/slf4j-log4j12-1.7.25.jar
首先:我知道关于这个主题有很多问题,但我遇到的情况与标准完全不同,我无法解决它。
现在我正在使用 Eclipse,并且我正在使用 2 个外部库:json 和 jgit。
问题是:json 有效,但 jgit 无效,为什么?
当我 运行 我的代码是
`Exception in thread "main" java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory
at org.eclipse.jgit.util.SystemReader.<clinit>(SystemReader.java:55)
at org.eclipse.jgit.lib.BaseRepositoryBuilder.readEnvironment(BaseRepositoryBuilder.java:363)
at org.eclipse.jgit.api.InitCommand.call(InitCommand.java:58)
at org.eclipse.jgit.api.CloneCommand.init(CloneCommand.java:267)
at org.eclipse.jgit.api.CloneCommand.call(CloneCommand.java:173)
at GitHub.GitHubAPI.init(GitHubAPI.java:35)
at GitHub.GitHubAPI.main(GitHubAPI.java:73)
Caused by: java.lang.ClassNotFoundException: org.slf4j.LoggerFactory
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:602)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
... 7 more
`
在网上看了一下,发现这个错误是因为运行时的JVM找不到我正在使用的class,但是我不明白如何解决这个问题。 奇怪的是,在另一个 class 中,我使用了 json 库,但没有给我任何问题。
对于这两个库,我所做的是转到“配置构建路径”,将 JAR 添加到“模块路径”,并将这些 JAR 的路径作为“类路径”中的变量添加。
这是我的代码,如果你需要的话。
package GitHub;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
//import java.util.logging.Logger;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.ListBranchCommand.ListMode;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.api.errors.InvalidRemoteException;
import org.eclipse.jgit.api.errors.TransportException;
import org.eclipse.jgit.lib.Ref;
//import org.eclipse.jgit.revwalk.RevCommit;
public class GitHubAPI {
// private static Logger myLogger = Logger.getLogger("InfoLogging");
private String projNameMin;
private final String url = "https://github.com/apache/";
private Git git;
private String repoLocalPath;
public GitHubAPI(String projectName) {
this.projNameMin = projectName.toLowerCase();
this.repoLocalPath = "./"+projNameMin+"Repo";
}
public void init() {
String uri = url + projNameMin + ".git";
try {
git = Git.cloneRepository().setURI(uri).setDirectory(new File(repoLocalPath)).call(); //this line triggers the error
} catch (InvalidRemoteException e) {
e.printStackTrace();
} catch (TransportException e) {
e.printStackTrace();
} catch (GitAPIException e) {
e.printStackTrace();
}
}
public ArrayList<GitCommit> getCommits(){
ArrayList<GitCommit> commits = new ArrayList<GitCommit>();
// Iterable<RevCommit> commitsLog = null;
try {
// boolean head = false;
List<Ref> branches = git.branchList().setListMode(ListMode.ALL).call();
for (Ref branch: branches) {
String branchName = branch.getName();
System.out.println(branchName);
if (branchName.startsWith("refs/heads/")) {
// head = true;
}
}
} catch (GitAPIException e) {
e.printStackTrace();
}
return commits;
}
public static void main(String[] args) {
GitHubAPI githubapi = new GitHubAPI("VCL");
githubapi.init();
githubapi.getCommits();
}
}
有人知道如何解决这个问题吗?
直截了当,错误是由于缺少 slf4j 依赖项造成的。
如果是maven项目,那么在pom.xml中添加这些依赖:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<!-- This is used for slf4j binding with log4j -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
<scope>test</scope>
</dependency>
或者通过从下面的链接下载将 jar 添加到类路径中。
Slf4j API - https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.25/slf4j-api-1.7.25.jar
Slf4j-Log4j12 - https://repo1.maven.org/maven2/org/slf4j/slf4j-log4j12/1.7.25/slf4j-log4j12-1.7.25.jar