The specified target project directory src\main\java does not exist
生成代码报错。
源码跟一下:
org.mybatis.generator.api.MyBatisGenerator#generate(org.mybatis.generator.api.ProgressCallback, java.util.Set<java.lang.String>, java.util.Set<java.lang.String>, boolean)
找到保存文件入口:
org.mybatis.generator.api.MyBatisGenerator#writeGeneratedXmlFile
private void writeGeneratedXmlFile(GeneratedXmlFile gxf, ProgressCallback callback)
throws InterruptedException, IOException {
File targetFile;
String source;
try {
//此处就是generatorConfig.xml中targetProject和targetPackage拼接出来的路径
File directory = shellCallback.getDirectory(gxf
.getTargetProject(), gxf.getTargetPackage());
targetFile = new File(directory, gxf.getFileName());
//省略...
}
继续进入shellCallback.getDirectory:
org.mybatis.generator.api.ShellCallback#getDirectory,ShellCallback是个接口,只有一个实现类:org.mybatis.generator.internal.DefaultShellCallback#getDirectory
public File getDirectory(String targetProject, String targetPackage)
throws ShellException {
// targetProject is interpreted as a directory that must exist
//
// targetPackage is interpreted as a sub directory, but in package
// format (with dots instead of slashes). The sub directory will be
// created
// if it does not already exist
//重点
File project = new File(targetProject);
if (!project.isDirectory()) {
throw new ShellException(getString("Warning.9", //$NON-NLS-1$
targetProject));
}
StringBuilder sb = new StringBuilder();
StringTokenizer st = new StringTokenizer(targetPackage, "."); //$NON-NLS-1$
while (st.hasMoreTokens()) {
sb.append(st.nextToken());
sb.append(File.separatorChar);
}
File directory = new File(project, sb.toString());
if (!directory.isDirectory()) {
boolean rc = directory.mkdirs();
if (!rc) {
throw new ShellException(getString("Warning.10", //$NON-NLS-1$
directory.getAbsolutePath()));
}
}
return directory;
}
跟到
File project = new File(targetProject);
if (!project.isDirectory()) {
throw new ShellException(getString("Warning.9", //$NON-NLS-1$
targetProject));
}
答案就呼之欲出了,主要看这个targetProject路径创建出来的File是不是isDirectory,不是的话就直接报错。
debug一下这个地方:
查看一下当前在那个路径
不是Directory,直接抛异常
其实上面找到根路径之后,自己根据项目结构来构造就可以了。
ps:说个题外话,mac和windows解析路径分隔符可能不太一样,
windows:src\main\java
mac: src/main/java
不注意的话就报错给你看😂。
基本就是这么一个debug过程。