有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

maven我怎样才能加载一个。为了读取类文件中的注释,是否将运行jar中的类文件转换为Java对象?

为了得到一个jar文件,我使用maven assembly插件打包了一个maven项目

我将以下java类从src/test/java(TestNG tests)文件夹打包到一个jar文件中

以下类位于jar内的以下路径中:

    target/test-classes/com/example/tests/ByCitiesTest.class
    target/test-classes/com/example/tests/FullCycle3HoursTest.class

我可以读取运行jar的这些类的位置,但我想加载这些类,以便读取TestNG注释(例如:@Test,@DataProvider,…)并使用我开发的定制TestRunner运行它们

我使用下面的代码在jar中读取并尝试加载。类文件:

    List<XmlClass> classes = new ArrayList<XmlClass>();
    Path currentRelativePath = Paths.get("");
    String s = currentRelativePath.toAbsolutePath().toString();
    System.out.println("Current relative path is: " + s);
    CodeSource src = TestRunner.class.getProtectionDomain().getCodeSource();
    URL jar = src.getLocation();
    JarFile jarFile = new JarFile(jar.getPath());
    Enumeration e = jarFile.entries();
    if (src != null) {
        ZipInputStream zip = new ZipInputStream(jar.openStream());
        ZipEntry ze;
        while ((ze = zip.getNextEntry()) != null) {
            String entryName = ze.getName();
            if (entryName.contains("target") && entryName.contains(".class") && entryName.contains("test")) {
                System.out.println(entryName);
            }
        }

    }


    URL[] urls = {new URL("jar:file:" + jar.getPath() + "!/")};
    URLClassLoader cl = URLClassLoader.newInstance(urls);
    InputStream in = cl.getResourceAsStream("target/test-classes/com/example/tests/ByCitiesTest.class");
    byte[] array = new byte[1024];
    ByteArrayOutputStream out = new ByteArrayOutputStream(array.length);
    int length = in.read(array);
    while (length > 0) {
        out.write(array, 0, length);
        length = in.read(array);
    }
    Class testclass = classHandler.defineCustomClass("ByCitiesTest", out);
    XmlClass singleClass = new XmlClass(testclass.getName());
    classes.add(singleClass);

函数defineCustomClass

public Class defineCustomClass(String name, ByteArrayOutputStream out) {
    return defineClass(name, out.toByteArray(), 0, out.size());
}

此函数使用Java ClassLoader类中的defineClass

我在执行过程中遇到的错误如下:

    Current relative path is: /Users/root/path/of/the/project-webdriver
    target/test-classes/com/example/BaseByHoursTest.class
    target/test-classes/com/example/pages/CardInformationPage.class
    target/test-classes/com/example/pages/ConfirmationPage.class
    target/test-classes/com/example/pages/ContactPage.class
    target/test-classes/com/example/pages/ExtrasPage.class        
    target/test-classes/com/example/pages/HomePage.class
    target/test-classes/com/example/pages/HotelPage.class
    target/test-classes/com/example/pages/ResultsPage.class
    target/test-classes/com/example/tests/ByCitiesTest.class
    target/test-classes/com/example/tests/FullCycle3HoursTest.class
    Exception in thread "main" java.lang.NoClassDefFoundError: ByCitiesTest (wrong name: com/example/tests/ByCitiesTest)

我不知道这个班的名字是什么,我怎么知道这个名字。我尝试将文件加载到InputStream中,然后尝试使用类加载器加载它

如何加载文件。类转换为java类对象? 如何从jar文件中的这些类中读取注释


共 (0) 个答案