2012-01-09 3 views
4

У меня есть исходная папка с исходными файлами Java. Эти файлы Java имеют разные пакеты. Используя команду javac, я могу создать структуру пакета, но пакеты будут содержать файлы классов, а не исходные файлы.Есть ли какой-либо API для создания структуры пакета из исходных файлов Java

Есть ли API, который генерирует структуру пакетов из Java-файлов и помещает Java-файлы в определенный пакет

+2

Значит, ваши .java-файлы не в правильной структуре? Это может быть глупый вопрос, но: почему? –

+0

, если вы укажете папку вывода так же, как корневую папку исходных файлов, javac поместит файлы классов вместе с исходными файлами. – Manish

+0

@ManishSharma, это не то, о чем спрашивает OP. – adarshr

ответ

1

Вот что я придумал для этого problem.It открывает файл 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; 
} 
} 
2

Предположив, что вы на 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 
+0

Я предлагаю 'package = $ (grep -h -m 1 пакет" $ file "| sed -e /.* package [[: space:]] \ + \ (. * \) [[: Space:] ] *;. */\ 1/'-e'// ./ \\ g ') '. Это сделает все за один раз. –

+0

@PhilippWendler Спасибо. Я люблю его! – adarshr

Смежные вопросы