Вы получили эту ошибку, потому что следовали плохо написанным указаниям в учебнике Heroes. Я столкнулся с тем же.
В частности, под заголовком Отображать имена героев в шаблоне , он указывает:
Чтобы отобразить героя имена в неупорядоченном списке, вставьте следующий фрагмент HTML под заголовком и над деталями героя.
blockquote>, за которым следует этот код:
<h2>My Heroes</h2> <ul class="heroes"> <li> <!-- each hero goes here --> </li> </ul>
Он делает не инструктируйте вас заменить предыдущий детальный код, и он должен. Вот почему мы остались с:
<h2>{{hero.name}} details!</h2>
вне нашего
*ngFor
.Однако, если вы прокрутите страницу вниз, вы увидите следующее:
Шаблон для отображения героев должен выглядеть так:
blockquote ><h2>My Heroes</h2> <ul class="heroes"> <li *ngFor="let hero of heroes"> <span class="badge">{{hero.id}}</span> {{hero.name}} </li> </ul>
Обратите внимание на отсутствие элементов детализации из предыдущих попыток.
Ошибка, подобная этой автору, может привести к довольно дикой гусиной погоне. Надеюсь, этот пост помогает другим избежать этого.
Наконец, я нашел решение:
final String path = "sample/folder";
final File jarFile = new File(getClass().getProtectionDomain().getCodeSource().getLocation().getPath());
if(jarFile.isFile()) { // Run with JAR file
final JarFile jar = new JarFile(jarFile);
final Enumeration<JarEntry> entries = jar.entries(); //gives ALL entries in jar
while(entries.hasMoreElements()) {
final String name = entries.nextElement().getName();
if (name.startsWith(path + "/")) { //filter according to the path
System.out.println(name);
}
}
jar.close();
} else { // Run with IDE
final URL url = Launcher.class.getResource("/" + path);
if (url != null) {
try {
final File apps = new File(url.toURI());
for (File app : apps.listFiles()) {
System.out.println(app);
}
} catch (URISyntaxException ex) {
// never happens
}
}
}
Второй блок работает только при запуске приложения на IDE (не с файлом jar), вы можете удалить его, если вам это не нравится .
Как указывают другие ответы, когда ресурсы находятся внутри файла jar, все становится действительно уродливым. В нашем случае это решение:
https://stackoverflow.com/a/13227570/516188
очень хорошо работает в тестах (поскольку тесты выполняются, код не упакован в файл jar), но не работает, когда приложение работает нормально. Итак, что я сделал ... Я жестко задаю список файлов в приложении, но у меня есть тест, который читает фактический список с диска (может делать это, так как это работает в тестах) и терпит неудачу, если фактический список не работает 't соответствует списку, который приложение возвращает.
Таким образом, у меня есть простой код в моем приложении (без трюков), и . Я уверен, что не забыл добавить новая запись в списке благодаря тесту.
Я знаю, это много лет назад. Но только для других людей встречают эту тему. Вы можете использовать метод getResourceAsStream()
с пути к каталогу, а входной поток будет иметь все имена файлов из этого каталога. После этого вы можете согласовать путь dir с каждым именем файла и вызвать getResourceAsStream для каждого файла в цикле.
Попробуйте следующее. Сделайте путь ресурса "<PathRelativeToThisClassFile>/<ResourceDirectory>"
. если ваш путь к классу - com.abc.package.MyClass и ваши файлы resoure находятся в файле src / com / abc / package / resources /:
URL url = MyClass.class.getResource("resources/");
if (url == null) {
// error - missing folder
} else {
File dir = new File(url.toURI());
for (File nextFile : dir.listFiles()) {
// Do something with nextFile
}
}
Вы также можете использовать
URL url = MyClass.class.getResource("/com/abc/package/resources/");
Следующий код возвращает желаемую «папку» как «Путь», независимо от того, находится ли она внутри банки или нет.
private Path getFolderPath() throws URISyntaxException, IOException {
URI uri = getClass().getClassLoader().getResource("folder").toURI();
if ("jar".equals(uri.getScheme())) {
FileSystem fileSystem = FileSystems.newFileSystem(uri, Collections.emptyMap(), null);
return fileSystem.getPath("path/to/folder/inside/jar");
} else {
return Paths.get(uri);
}
}
Требуется java 7 +.
Магия - метод getResourceAsStream ():
InputStream is =
this.getClass().getClassLoader().getResourceAsStream("yourpackage/mypackage/myfile.xml")
В моем файле jar у меня была папка с именем Upload, в этой папке было три других текстовых файла внутри, и мне нужно было иметь точно такую же папку и файлы вне файла jar, я использовал следующий код:
URL inputUrl = getClass().getResource("/upload/blabla1.txt");
File dest1 = new File("upload/blabla1.txt");
FileUtils.copyURLToFile(inputUrl, dest1);
URL inputUrl2 = getClass().getResource("/upload/blabla2.txt");
File dest2 = new File("upload/blabla2.txt");
FileUtils.copyURLToFile(inputUrl2, dest2);
URL inputUrl3 = getClass().getResource("/upload/blabla3.txt");
File dest3 = new File("upload/Bblabla3.txt");
FileUtils.copyURLToFile(inputUrl3, dest3);
Простой ... используйте OSGi. В OSGi вы можете перебирать записи своего Bundle с помощью findEntries и findPaths.
Другое решение, вы можете сделать это с помощью ResourceLoader
следующим образом:
import org.springframework.core.io.Resource;
import org.apache.commons.io.FileUtils;
@Autowire
private ResourceLoader resourceLoader;
...
Resource resource = resourceLoader.getResource("classpath:/path/to/you/dir");
File file = resource.getFile();
Iterator<File> fi = FileUtils.iterateFiles(file, null, true);
while(fi.hasNext()) {
load(fi.next())
}
У меня была та же проблема в руках, когда я пытался загрузить некоторые конфигурации хаопов из ресурсов, упакованных в банку ... как на IDE, так и на jar (версия выпуска).
Я нашел java.nio.file.DirectoryStream
, чтобы работать лучше, чтобы перебирать содержимое каталогов по локальной файловой системе и jar.
String fooFolder = "/foo/folder";
....
ClassLoader classLoader = foofClass.class.getClassLoader();
try {
uri = classLoader.getResource(fooFolder).toURI();
} catch (URISyntaxException e) {
throw new FooException(e.getMessage());
} catch (NullPointerException e){
throw new FooException(e.getMessage());
}
if(uri == null){
throw new FooException("something is wrong directory or files missing");
}
/** i want to know if i am inside the jar or working on the IDE*/
if(uri.getScheme().contains("jar")){
/** jar case */
try{
URL jar = FooClass.class.getProtectionDomain().getCodeSource().getLocation();
//jar.toString() begins with file:
//i want to trim it out...
Path jarFile = Paths.get(jar.toString().substring("file:".length()));
FileSystem fs = FileSystems.newFileSystem(jarFile, null);
DirectoryStream<Path> directoryStream = Files.newDirectoryStream(fs.getPath(fooFolder));
for(Path p: directoryStream){
InputStream is = FooClass.class.getResourceAsStream(p.toString()) ;
performFooOverInputStream(is);
/** your logic here **/
}
}catch(IOException e) {
throw new FooException(e.getMessage());
}
}
else{
/** IDE case */
Path path = Paths.get(uri);
try {
DirectoryStream<Path> directoryStream = Files.newDirectoryStream(path);
for(Path p : directoryStream){
InputStream is = new FileInputStream(p.toFile());
performFooOverInputStream(is);
}
} catch (IOException _e) {
throw new FooException(_e.getMessage());
}
}