Exception in thread “main” java.nio.fichier.InvalidPathException: Illégal char <:> à l'index 2:

J'ai copier classpath ressource à partir d'un package à un autre.

Mon programme est:

    public static void main(String[] args) throws IOException, URISyntaxException {

            ClassLoader classLoader = CopyFileToDirectoryTest.class.getClassLoader();
InputStream in = classLoader.getResourceAsStream("com/stackoverflow/main/Movie.class");

            URI uri = ClassLoader.getSystemResource("com/stackoverflow/json").toURI();
            Path path = Paths.get(uri.getPath(),"Movie.class");
            System.out.println(path);

            long copy = Files.copy(in, path, StandardCopyOption.REPLACE_EXISTING);
            System.out.println(copy);

        }

À Files.copy méthode-je obtenir de l'exception:

Exception in thread "main" java.nio.file.InvalidPathException: Illegal char <:> at index 2: /D:/Programs/workspaceEE/HibernateDemo/target/classes/com/stackoverflow/json
    at sun.nio.fs.WindowsPathParser.normalize(WindowsPathParser.java:182)
    at sun.nio.fs.WindowsPathParser.parse(WindowsPathParser.java:153)
    at sun.nio.fs.WindowsPathParser.parse(WindowsPathParser.java:77)
    at sun.nio.fs.WindowsPath.parse(WindowsPath.java:94)
    at sun.nio.fs.WindowsFileSystem.getPath(WindowsFileSystem.java:255)
    at java.nio.file.Paths.get(Paths.java:84)
    at com.stackoverflow.main.CopyFileToDirectoryTest.main(CopyFileToDirectoryTest.java:34)

Comment le résoudre?

Solution

public static void main(String[] args) throws IOException, URISyntaxException {
        ClassLoader classLoader = CopyFileToDirectoryTest.class.getClassLoader();
        InputStream in = classLoader.getResourceAsStream("com//stackoverflow//main//Movie.class");
        URI uri = ClassLoader.getSystemResource("com//stackoverflow//json").toURI();
        String mainPath = Paths.get(uri).toString();
        Path path = Paths.get(mainPath, "Movie.class");
        System.out.println(path);
        long copy = Files.copy(in, path, StandardCopyOption.REPLACE_EXISTING);
        System.out.println(copy);
    }

Correctement ce code copies Movie.class de colis com/stackoverflow/main en com/stackoverflow/json.

Cela ne fonctionne pas parce que votre classe est composée de transparence et de opaque ressources - telles que celles à l'intérieur d'un jar. Vous essayez d'écrire sur un chemin qui ressemble à quelque chose comme jar:file:/com/stackoverflow/json, ce qui n'est pas valide Path ou File mais une URI valide. En général, vous ne pouvez pas écrire le chemin de la classe, seulement les lire.
Pas de pot, il est projet maven
Lorsque vous compilez un projet Maven, il va générer un jar. Sinon, comment voulez-vous distribuer votre code compilé? (Pré Java 9)

OriginalL'auteur Jay Smith | 2017-05-15