是否有任何 API 可以从 Java 源文件生成包结构
Posted
技术标签:
【中文标题】是否有任何 API 可以从 Java 源文件生成包结构【英文标题】:Is there any API to generate package structure from Java source files 【发布时间】:2012-01-09 11:24:41 【问题描述】:我有一个包含 Java 源文件的源文件夹。这些 Java 文件有不同的包。使用 javac 命令我可以生成包结构,但包将包含类文件而不是源文件。
是否有任何API可以从Java文件生成包结构并将Java文件放入特定的包中
【问题讨论】:
所以您的 .java 文件一开始的结构不正确?这可能是一个愚蠢的问题,但是:为什么? 如果您指定的输出文件夹与源文件根文件夹相同,javac 会将类文件放在源文件旁边。 @ManishSharma 这不是 OP 所要求的。 我支持@JoachimSauer 的推理。为什么它们一开始的结构不正确? 上述结构将作为我目前正在处理的 UML 图生成器项目的输入。所以它的输入具有这种结构。 【参考方案1】:假设您使用的是 Windows,我编写了一个批处理脚本来执行此操作。
将以下内容复制到source.bat
,将source.bat
放在您找到所有.java
文件的同一目录中,然后运行它。
@echo off
@setlocal enabledelayedexpansion
for /f "usebackq delims=" %%f in (`dir /s /b *.java`) do (
set file=%%~nxf
for /f "usebackq delims=" %%p in (`findstr package %%~nxf`) do (
set package=%%p
set package=!package:*.java:=!
set package=!package:package =!
set package=!package:;=!
set package=!package:.=\!
echo Expanding !package!...
mkdir !package!
xcopy /f %%~nxf !package!
)
)
@endlocal
如果您使用的是 Unix/Linux,这里有一个 bash
脚本。我确信这可以以更好、更简洁的方式完成,但它确实有效。
#! /bin/bash
for file in *.java
do
package=`grep -h 'package' $file`
package=`echo $package | sed 's/package//g'`
package=`echo $package | sed 's/;//g'`
package=`echo $package | sed 's/\./\//g'`
echo Expanding $package...
mkdir -p $package
cp $file $package
done
【讨论】:
我建议package=$(grep -h -m 1 package "$file" | sed -e 's/.*package[[:space:]]\+\(.*\)[[:space:]]*;.*/\1/' -e 's/\./\//g')
。这将一次性完成。
@PhilippWendler 谢谢。我爱oneliners!【参考方案2】:
这是我为这个问题提出的。它打开 java 文件,读取包名,生成结构并将文件复制到该结构。欢迎提出改进建议。 :)
public final class FileListing
private Map packageMap;
public void createPackageStructure(String sourceDir) throws FileNotFoundException
FileListing fileListing = new FileListing();
File startingDirectory= new File(sourceDir);
fileListing.packageMap = new HashMap();
List<File> files = fileListing.getFileListing(startingDirectory, fileListing.getPackageMap());
fileListing.moveFiles(fileListing.packageMap);
public List<File> getFileListing(File aStartingDir, Map packageMap) throws FileNotFoundException
validateDirectory(aStartingDir);
List<File> result = getFileListingNoSort(aStartingDir,packageMap);
Collections.sort(result);
return result;
private List<File> getFileListingNoSort(File aStartingDir, Map packageMap) throws FileNotFoundException
List<File> result = new ArrayList<File>();
File[] filesAndDirs = aStartingDir.listFiles();
List<File> filesDirs = Arrays.asList(filesAndDirs);
for(File file : filesDirs)
result.add(file);
if(file.isFile())
packageMap.put(file, readPackageName(file.getAbsolutePath()).replace(".", "/").replace(";", "/"));
else
//must be a directory
//recursive call!
List<File> deeperList = getFileListingNoSort(file,packageMap);
result.addAll(deeperList);
return result;
public String readPackageName(String filePath)
String packageName=null;
String line;
String temp[] = new String[2];
BufferedReader br=null;
try
File javaFile = new File(filePath);
br = new BufferedReader(new FileReader(javaFile));
while((line=br.readLine())!=null)
if(line.indexOf("package")!=-1)
temp = line.split(" ");
break;
br.close();
catch(FileNotFoundException fnfe)
fnfe.printStackTrace();
catch(IOException ioe)
ioe.printStackTrace();
return temp[1];
public void moveFiles(Map packageMap)
Set keySet = packageMap.keySet();
Iterator it = keySet.iterator();
File sourceFile, destFile, destDirs;
InputStream in = null;
OutputStream out = null;
byte[] buf = new byte[1024];
int len;
try
while(it.hasNext())
sourceFile = (File)it.next();
destDirs = new File("src/"+(String)packageMap.get(sourceFile));
destFile = new File("src/"+ (String)packageMap.get(sourceFile)+"/"+sourceFile.getName());
destDirs.mkdirs();
in = new FileInputStream(sourceFile);
out = new FileOutputStream(destFile);
while((len = in.read(buf)) > 0)
out.write(buf, 0, len);
catch(FileNotFoundException fnfe)
fnfe.printStackTrace();
catch(IOException ioe)
ioe.printStackTrace();
static private void validateDirectory (File aDirectory) throws FileNotFoundException
if (aDirectory == null)
throw new IllegalArgumentException("Directory should not be null.");
if (!aDirectory.exists())
throw new FileNotFoundException("Directory does not exist: " + aDirectory);
if (!aDirectory.isDirectory())
throw new IllegalArgumentException("Is not a directory: " + aDirectory);
if (!aDirectory.canRead())
throw new IllegalArgumentException("Directory cannot be read: " + aDirectory);
public Map getPackageMap()
return this.packageMap;
【讨论】:
以上是关于是否有任何 API 可以从 Java 源文件生成包结构的主要内容,如果未能解决你的问题,请参考以下文章
是否有任何命令行工具可以从 db 生成 Java 实体类(不是 Netbeans 或 Eclipse 向导)