Java Jar文件找不到文件夹位置

Java Jar文件找不到文件夹位置,java,Java,我有一个代码,它获取给定包名中的类文件列表。但是,代码返回给定包(com.testscript)中可用的类文件列表,但当我使用与包(src.com.testscript)相同的代码运行jar时,它不会返回文件夹和子文件夹中可用的类文件列表。我已经把这个jar文件放在包含jar文件和scr包的主文件夹下。下面是我用来获取类列表的代码 package com.generateUI.createXML; import java.io.IOException; import java.lang.ref

我有一个代码,它获取给定包名中的类文件列表。但是,代码返回给定包(com.testscript)中可用的类文件列表,但当我使用与包(src.com.testscript)相同的代码运行jar时,它不会返回文件夹和子文件夹中可用的类文件列表。我已经把这个jar文件放在包含jar文件和scr包的主文件夹下。下面是我用来获取类列表的代码

package com.generateUI.createXML;

import java.io.IOException;
import java.lang.reflect.Constructor;
import java.io.*;
import java.lang.reflect.Method;
import java.net.URL;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.testng.IAnnotationTransformer;
import org.testng.annotations.ITestAnnotation;
import org.testng.internal.ClassHelper;
import org.testng.internal.annotations.AnnotationHelper;
import org.testng.internal.annotations.IAnnotationFinder;
import org.testng.internal.annotations.JDK15AnnotationFinder;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

import com.setup.CreateMethodsList;

public class FindTestMethodsInTestClass {

    public boolean isMethodsListXMLReady() throws ClassNotFoundException, IOException, InterruptedException {
        FindTestMethodsInTestClass FTMITC = new FindTestMethodsInTestClass();
        boolean bool=false;
        boolean isXMLFileExist = false;
        Map<String,CreateMethodsList> aMap=new HashMap<String,CreateMethodsList>();
        Class[] classes=getClasses("com.testscript");
        IAnnotationFinder finder = new JDK15AnnotationFinder(new DummyTransformer());
        for(Class cls:classes){
            String temp=cls.toString();
            String[] className=temp.split("\\.");
            String[] classPaht=temp.split(" ");
            List<String> mNames=new ArrayList();
            Set<Method> allMethods = ClassHelper.getAvailableMethods(cls);
            if(!(allMethods==null)){
                for (Method eachMethod : allMethods) {
                    ITestAnnotation value = AnnotationHelper.findTest(finder, eachMethod);
                    if (value != null) {
                        mNames.add(eachMethod.getName());
                        bool=true;
                    }
                }
                if(bool){
                    int lastIndex=className.length-1;
                    aMap.put(className[lastIndex],new CreateMethodsList(mNames,classPaht[1]));
                }
            }
        }
        if(FTMITC.CreateXML(aMap)){
            isXMLFileExist=true;
        }
        return isXMLFileExist;
    }

    public static class DummyTransformer implements IAnnotationTransformer {

        @SuppressWarnings("rawtypes")
        @Override
        public void transform(ITestAnnotation annotation, Class testClass, Constructor testConstructor,
                Method testMethod) {
        }
    }

    /**
     * Scans all classes accessible from the context class loader which belong to the given package and subpackages.
     *
     * @param packageName The base package
     * @return The classes
     * @throws ClassNotFoundException
     * @throws IOException
     */
    private static Class[] getClasses(String packageName)  throws ClassNotFoundException, IOException {

        ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
        assert classLoader != null;
        String path = packageName.replace('.', '/');
        Enumeration<URL> resources = classLoader.getResources(path);
        List<File> dirs = new ArrayList<File>();
        System.out.println("<URL> resources: "+resources);
        while (resources.hasMoreElements()) {
            URL resource = new URL( resources.nextElement().toString().replace("%20", " "));
            System.out.println("URL Resource: "+resources);
            dirs.add(new File(resource.getFile()));
        }
        ArrayList<Class> classes = new ArrayList<Class>();
        for (File directory : dirs) {
            classes.addAll(findClasses(directory, packageName));
        }
        System.out.println("<Class> classes: "+resources);
        return classes.toArray(new Class[classes.size()]);
    }

    /**
     * Recursive method used to find all classes in a given directory and subdirs.
     *
     * @param directory   The base directory
     * @param packageName The package name for classes found inside the base directory
     * @return The classes
     * @throws ClassNotFoundException
     */
    private static List<Class> findClasses(File directory, String packageName) throws ClassNotFoundException {
        List<Class> classes = new ArrayList<Class>();
        if (!directory.exists()) {
            return classes;
        }
        File[] files = directory.listFiles();
        for (File file : files) {
            if (file.isDirectory()) {
                assert !file.getName().contains(".");
                classes.addAll(findClasses(file, packageName + "." + file.getName()));
            } else if (file.getName().endsWith(".class")) {
                classes.add(Class.forName(packageName + '.' + file.getName().substring(0, file.getName().length() - 6)));
            }
        }
        return classes;
    }

    public boolean CreateXML(Map map) throws InterruptedException{
        boolean bool=false;
        try {
            File file = new File(".\\MethodsList.xml");
            if(file.exists()){
                file.delete();
                Thread.sleep(2000);
            }
            Set<String> keys=map.keySet();
            List<String>methodsName=new ArrayList();
            DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder docBuilder = docFactory.newDocumentBuilder();

            // root elements
            Document doc = docBuilder.newDocument();
            Element rootElement = doc.createElement("TestMethodsList");
            doc.appendChild(rootElement);
            for(String key:keys){
                //              System.out.println(key);
                // classname elements
                Element ClassName = doc.createElement(key);
                rootElement.appendChild(ClassName);
                methodsName=((CreateMethodsList) map.get(key)).getMehodsList();
                String path=((CreateMethodsList) map.get(key)).getClassPath();
                Element classPath = doc.createElement("classPath");
                classPath.appendChild(doc.createTextNode(path));
                ClassName.appendChild(classPath);
                for(String str:methodsName){
                    // methodName elements
                    Element methodName = doc.createElement("methodName");
                    methodName.appendChild(doc.createTextNode(str));
                    ClassName.appendChild(methodName);
                }
            }

            // write the content into xml file
            TransformerFactory transformerFactory = TransformerFactory.newInstance();
            Transformer transformer = transformerFactory.newTransformer();
            DOMSource source = new DOMSource(doc);
            String filePath=".\\MethodsList.xml";
            StreamResult result = new StreamResult(new File(filePath).toString().replace("%20", " "));
            //StreamResult result =  new StreamResult(System.out);
            transformer.transform(source, result);
            if(new File(".\\MethodsList.xml").exists()){
                bool=true;
            }
            // Output to console for testing
            // StreamResult result = new StreamResult(System.out);

        } catch (ParserConfigurationException pce) {
            bool=false;
            pce.printStackTrace();
        } catch (TransformerException tfe) {
            bool=false;
            tfe.printStackTrace();
        }
        return bool;
    }

    public static void main(String arg[]) throws ClassNotFoundException, IOException, InterruptedException{
        FindTestMethodsInTestClass FTMITC=new FindTestMethodsInTestClass();
        System.out.println(FTMITC.isMethodsListXMLReady());
    }
}
package com.generateUI.createXML;
导入java.io.IOException;
导入java.lang.reflect.Constructor;
导入java.io.*;
导入java.lang.reflect.Method;
导入java.net.URL;
导入java.util.ArrayList;
导入java.util.Enumeration;
导入java.util.HashMap;
导入java.util.List;
导入java.util.Map;
导入java.util.Set;
导入javax.xml.parsers.DocumentBuilder;
导入javax.xml.parsers.DocumentBuilderFactory;
导入javax.xml.parsers.parserConfiguration异常;
导入javax.xml.transform.Transformer;
导入javax.xml.transform.TransformerException;
导入javax.xml.transform.TransformerFactory;
导入javax.xml.transform.dom.DOMSource;
导入javax.xml.transform.stream.StreamResult;
导入org.testng.IAnnotationTransformer;
导入org.testng.annotations.ITestAnnotation;
导入org.testng.internal.ClassHelper;
导入org.testng.internal.annotations.AnnotationHelper;
导入org.testng.internal.annotations.IANotationFinder;
导入org.testng.internal.annotations.JDK15AnnotationFinder;
导入org.w3c.dom.Document;
导入org.w3c.dom.Element;
导入com.setup.CreateMethodsList;
公共类FindTestMethodsInTestClass{
公共布尔值IsMethodListXMLReady()抛出ClassNotFoundException、IOException、InterruptedException{
FindTestMethodsInTestClass FTMITC=新的FindTestMethodsInTestClass();
布尔布尔布尔=假;
布尔值isXMLFileExist=false;
Map aMap=newhashmap();
Class[]classes=getClasses(“com.testscript”);
IANotationFinder=新的JDK15AnnotationFinder(新的DummyTransformer());
对于(类别cls:类别){
字符串温度=cls.toString();
字符串[]className=temp.split(“\\”);
字符串[]classPaht=temp.split(“”);
List mNames=new ArrayList();
设置allMethods=ClassHelper.getAvailableMethods(cls);
如果(!(allMethods==null)){
对于(每个方法:所有方法){
ITestAnnotation值=AnnotationHelper.findTest(finder,eachMethod);
if(值!=null){
mNames.add(eachMethod.getName());
布尔=真;
}
}
如果(bool){
int lastIndex=className.length-1;
aMap.put(className[lastIndex],newcreateMethodsList(mNames,classPaht[1]);
}
}
}
if(FTMITC.CreateXML(aMap)){
isXMLFileExist=true;
}
返回isXMLFileExist;
}
公共静态类DummyTransformer实现了一个NotationTransformer{
@抑制警告(“原始类型”)
@凌驾
公共void转换(ITestAnnotation注释、类testClass、构造函数testConstructor、,
方法(测试方法){
}
}
/**
*扫描可从上下文类加载器访问的属于给定包和子包的所有类。
*
*@param packageName基本包
*@还课
*@ClassNotFoundException
*@抛出异常
*/
私有静态类[]getClasses(String packageName)抛出ClassNotFoundException、IOException{
ClassLoader ClassLoader=Thread.currentThread().getContextClassLoader();
断言类加载器!=null;
字符串路径=packageName.replace('.','/');
枚举资源=classLoader.getResources(路径);
List dirs=new ArrayList();
System.out.println(“资源:+resources”);
while(resources.hasMoreElements()){
URL资源=新的URL(resources.nextElement().toString().replace(“%20”和“);
System.out.println(“URL资源:+资源”);
添加(新文件(resource.getFile());
}
ArrayList类=新的ArrayList();
for(文件目录:dirs){
addAll(findClasses(目录,packageName));
}
System.out.println(“类:”+资源);
返回classes.toArray(新类[classes.size()]);
}
/**
*递归方法,用于查找给定目录和子目录中的所有类。
*
*@param directory基本目录
*@param packageName在基目录中找到的类的包名
*@还课
*@ClassNotFoundException
*/
私有静态列表FindClass(文件目录、字符串packageName)引发ClassNotFoundException{
列表类=新的ArrayList();
如果(!directory.exists()){
返回类;
}
File[]files=目录.listFiles();
用于(文件:文件){
if(file.isDirectory()){
assert!file.getName()包含(“.”);
addAll(findClasses(文件,packageName+““+file.getName());
}else if(file.getName().endsWith(“.class”)){
Class.add(Class.forName(packageName+'.+file.getName().substring(0,file.getName().length()-6));
}
}
返回类;
}
公共布尔CreateXML(映射)抛出InterruptedException{
布尔布尔布尔=假;
试一试{
File File=新文件(“.\\MethodsList.xml”);
if(file.exists()){
delete();
《睡眠》(2000年);
}
Set keys=map.keySet();
ListmethodsName=new ArrayList();
DocumentBuilderFactory docFactory=DocumentBuil