如何修复Tomcat应用程序java.nio.file.AccessDeniedException

如何修复Tomcat应用程序java.nio.file.AccessDeniedException,java,linux,ubuntu,tomcat,permissions,Java,Linux,Ubuntu,Tomcat,Permissions,请注意,我对Ubuntu服务器和linux一般来说都是新手 我有一个java脚本,可以从url下载xml文件并将其导入数据库。它在我的本地机器上运行良好,但在上传到我的vps(使用ubuntu 18.04和Tomcat)后,我在运行脚本时出现以下错误: java.nio.file.AccessDeniedException: f1e4485c8f9fed7e4af0672c5f8bd0d0.xml at java.base/sun.nio.fs.UnixException.transla

请注意,我对Ubuntu服务器和linux一般来说都是新手

我有一个java脚本,可以从url下载xml文件并将其导入数据库。它在我的本地机器上运行良好,但在上传到我的vps(使用ubuntu 18.04和Tomcat)后,我在运行脚本时出现以下错误:

java.nio.file.AccessDeniedException: f1e4485c8f9fed7e4af0672c5f8bd0d0.xml
    at java.base/sun.nio.fs.UnixException.translateToIOException(UnixException.java:90) ~[na:na]
    at java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:111) ~[na:na]
    at java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:116) ~[na:na]
    at java.base/sun.nio.fs.UnixFileSystemProvider.newByteChannel(UnixFileSystemProvider.java:219) ~[na:na]
    at java.base/java.nio.file.spi.FileSystemProvider.newOutputStream(FileSystemProvider.java:478) ~[na:na]
    at java.base/java.nio.file.Files.newOutputStream(Files.java:219) ~[na:na]
    at java.base/java.nio.file.Files.copy(Files.java:3066) ~[na:na]
    at com.keuzestress.api.keuzestressapi.resource.xml.CoolblueImport.doImport(CoolblueImport.java:53) ~[classes/:0.0.1-SNAPSHOT]
    at com.keuzestress.api.keuzestressapi.resource.xml.CoolblueImport$$FastClassBySpringCGLIB$$de9a1a6.invoke(<generated>) ~[classes/:0.0.1-SNAPSHOT]
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.2.1.RELEASE.jar:5.2.1.RELEASE]
...
java.nio.file.AccessDeniedException:f1e4485c8f9fed7e4af0672c5f8bd0d0.xml
在java.base/sun.nio.fs.UnixException.translateToIOException(UnixException.java:90)~[na:na]
在java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:111)~[na:na]
在java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:116)~[na:na]
在java.base/sun.nio.fs.UnixFileSystemProvider.newbytechnel(UnixFileSystemProvider.java:219)~[na:na]
在java.base/java.nio.file.spi.FileSystemProvider.newOutputStream(FileSystemProvider.java:478)~[na:na]
在java.base/java.nio.file.Files.newOutputStream(Files.java:219)~[na:na]
在java.base/java.nio.file.Files.copy(Files.java:3066)~[na:na]
在com.keuzestress.api.keuzestressapi.resource.xml.CoolblueImport.doImport(CoolblueImport.java:53)~[classes/:0.0.1-SNAPSHOT]
在com.keuzestress.api.keuzestressapi.resource.xml.CoolblueImport$$FastClassBySpringCGLIB$$de9a1a6.invoke()~[classes/:0.0.1-SNAPSHOT]
在org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)~[spring-core-5.2.1.RELEASE.jar:5.2.1.RELEASE]
...
我很清楚,存在某种权限问题。我不知道文件保存在哪里。我尝试检查tomcat子文件夹,但找不到应该授予相应权限的文件夹

java导入脚本:

@Component
public class CoolblueImport implements importInterface{
    public List<CoolblueProduct> coolblueProductList = new ArrayList<>();
    public List<Product> productList = new ArrayList<>();
    String url = "http://feeds.performancehorizon.com/.../f1e4485c8f9fed7e4af0672c5f8bd0d0.xml";

    Logger logger = LoggerFactory.getLogger(CoolblueImport.class);

    @Autowired
    ProductRepository productRepository;

    @Transactional
    public List<Product> doImport() throws ParserConfigurationException, IOException, SAXException {
        coolblueProductList.clear();

        InputStream in = new URL(url).openStream();
        Files.copy(in, Paths.get("f1e4485c8f9fed7e4af0672c5f8bd0d0.xml"), StandardCopyOption.REPLACE_EXISTING);

        File file = new File("f1e4485c8f9fed7e4af0672c5f8bd0d0.xml");
...
@组件
公共类CoolblueImport实现importInterface{
public List coolblueProductList=new ArrayList();
public List productList=new ArrayList();
字符串url=”http://feeds.performancehorizon.com/.../f1e4485c8f9fed7e4af0672c5f8bd0d0.xml";
Logger Logger=LoggerFactory.getLogger(CoolblueImport.class);
@自动连线
产品库产品库;
@交易的
public List doImport()抛出ParserConfiguration异常、IOException、SAXException{
coolblueProductList.clear();
InputStream in=新URL(URL).openStream();
文件.copy(在中,路径.get(“f1e4485c8f9fed7e4af0672c5f8bd0d0.xml”)、标准copyoption.REPLACE_EXISTING);
File File=新文件(“f1e4485c8f9fed7e4af0672c5f8bd0d0.xml”);
...

提前感谢!欢迎提供任何帮助:)

最终,您的Tomcat进程没有将
.xml
文件写入Tomcat正在运行的当前工作目录的正确权限。尝试运行时:

Files.copy(in, Paths.get("f1e4485c8f9fed7e4af0672c5f8bd0d0.xml"), StandardCopyOption.REPLACE_EXISTING); 
不允许Tomcat进程创建该文件

一种可能是在临时目录中创建文件。一种方法是将代码更改为:

Files.copy(in,
    Paths.get(System.getProperty("java.io.tmpdir") + 
    System.getProperty("file.separator") + 
    "f1e4485c8f9fed7e4af0672c5f8bd0d0.xml"), StandardCopyOption.REPLACE_EXISTING);
这看起来很大,但它所做的是以独立于O/S的方式创建指向Java临时目录的文件路径。这是一个几乎所有进程都可以在Windows和Unix中写入的目录。还有其他方法可以执行相同的操作,例如
Files.createTempFile()
这在概念上是相似的

请记住,如果再次使用文件名(如下一行代码中的文件名),则需要使用相同的路径。您没有说明要对输出文件执行什么操作,但请注意临时目录正是如此。在Unix中,机器重新启动会将其清除,因此如果需要保留该文件,您将需要更大的权限永久位置。

有关在Debian安装中读取/写入任意文件夹(而不仅仅是
java.io.tmpdir
)的信息,请参见