diff --git a/pom.xml b/pom.xml
index 37c9163..421b430 100644
--- a/pom.xml
+++ b/pom.xml
@@ -30,7 +30,7 @@
   </parent>
 
   <artifactId>maven-remote-resources-plugin</artifactId>
-  <version>3.0.1-SNAPSHOT</version>
+  <version>3.1.0-SNAPSHOT</version>
   <packaging>maven-plugin</packaging>
 
   <name>Apache Maven Remote Resources Plugin</name>
@@ -68,7 +68,7 @@
   </distributionManagement>
 
   <properties>
-    <javaVersion>7</javaVersion>
+    <javaVersion>8</javaVersion>
     <mavenVersion>3.2.5</mavenVersion>
     <project.build.outputTimestamp>2022-07-17T16:33:17Z</project.build.outputTimestamp>
 
diff --git a/src/main/java/org/apache/maven/plugin/resources/remote/ModelInheritanceAssembler.java b/src/main/java/org/apache/maven/plugin/resources/remote/ModelInheritanceAssembler.java
index 31000ae..e713afd 100644
--- a/src/main/java/org/apache/maven/plugin/resources/remote/ModelInheritanceAssembler.java
+++ b/src/main/java/org/apache/maven/plugin/resources/remote/ModelInheritanceAssembler.java
@@ -478,9 +478,8 @@
 
             Map<String, ReportSet> childReportSets = child.getReportSetsAsMap();
 
-            for ( Object parentReportSet1 : parentReportSets )
+            for ( ReportSet parentReportSet : parentReportSets )
             {
-                ReportSet parentReportSet = (ReportSet) parentReportSet1;
 
                 if ( !handleAsInheritance || parentIsInherited )
                 {
diff --git a/src/main/java/org/apache/maven/plugin/resources/remote/ProcessRemoteResourcesMojo.java b/src/main/java/org/apache/maven/plugin/resources/remote/ProcessRemoteResourcesMojo.java
index cd70a67..cedeb5d 100644
--- a/src/main/java/org/apache/maven/plugin/resources/remote/ProcessRemoteResourcesMojo.java
+++ b/src/main/java/org/apache/maven/plugin/resources/remote/ProcessRemoteResourcesMojo.java
@@ -21,7 +21,6 @@
 
 import java.io.ByteArrayInputStream;
 import java.io.File;
-import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.FileReader;
@@ -38,6 +37,7 @@
 import java.io.Writer;
 import java.net.MalformedURLException;
 import java.net.URL;
+import java.nio.file.Files;
 import java.text.SimpleDateFormat;
 import java.util.AbstractMap;
 import java.util.ArrayList;
@@ -493,7 +493,7 @@
                 catch ( MalformedURLException e )
                 {
                     // ignore
-                    getLog().debug( "URL issue with supplemental-models.xml: " + e.toString() );
+                    getLog().debug( "URL issue with supplemental-models.xml: " + e );
                 }
             }
         }
@@ -696,7 +696,7 @@
                 getLog().debug( "Adding project with groupId [" + p.getGroupId() + "]" );
             }
         }
-        Collections.sort( projects, new ProjectComparator() );
+        projects.sort( new ProjectComparator( ) );
         return projects;
     }
 
@@ -714,12 +714,7 @@
                 return dependencyResolver.resolve( project, Arrays.asList( resolveScopes ), mavenSession );
             }
         }
-        catch ( ArtifactResolutionException e )
-        {
-            throw new IllegalStateException( "Failed to resolve dependencies for one or more projects in the reactor. "
-                + "Reason: " + e.getMessage(), e );
-        }
-        catch ( ArtifactNotFoundException e )
+        catch ( ArtifactResolutionException | ArtifactNotFoundException e )
         {
             throw new IllegalStateException( "Failed to resolve dependencies for one or more projects in the reactor. "
                 + "Reason: " + e.getMessage(), e );
@@ -873,7 +868,7 @@
     {
         if ( encoding != null )
         {
-            return new InputStreamReader( new FileInputStream( source ), encoding );
+            return new InputStreamReader( Files.newInputStream( source.toPath() ), encoding );
         }
         else
         {
@@ -918,9 +913,9 @@
 
         if ( file.exists() )
         {
-            try ( InputStream is = new FileInputStream( file ) )
+            try ( InputStream is = Files.newInputStream( file.toPath() );
+                 InputStream newContents = new ByteArrayInputStream( outStream.getData() ) )
             {
-                final InputStream newContents = new ByteArrayInputStream( outStream.getData() );
                 needOverwrite = !IOUtil.contentEquals( is, newContents );
                 if ( getLog().isDebugEnabled() )
                 {
@@ -937,7 +932,7 @@
         }
         getLog().debug( "Writing " + file );
         
-        try ( OutputStream os = new FileOutputStream( file ) )
+        try ( OutputStream os = Files.newOutputStream( file.toPath() ) )
         {
             outStream.writeTo( os );
         }
@@ -1279,7 +1274,7 @@
                     if ( appendedResourceFile.exists() )
                     {
                         getLog().info( "Copying appended resource: " + projectResource );
-                        try ( InputStream in = new FileInputStream( appendedResourceFile );
+                        try ( InputStream in = Files.newInputStream( appendedResourceFile.toPath() );
                               OutputStream out = new FileOutputStream( f, true ) )
                         {
                             IOUtil.copy( in, out );
@@ -1374,7 +1369,7 @@
         return groupId.trim() + ":" + artifactId.trim();
     }
 
-    private Map<String, Model> loadSupplements( String models[] )
+    private Map<String, Model> loadSupplements( String[] models )
         throws MojoExecutionException
     {
         if ( models == null )
diff --git a/src/test/java/org/apache/maven/plugin/resources/remote/RemoteResourcesMojoTest.java b/src/test/java/org/apache/maven/plugin/resources/remote/RemoteResourcesMojoTest.java
index 87b34ba..26e8e0f 100644
--- a/src/test/java/org/apache/maven/plugin/resources/remote/RemoteResourcesMojoTest.java
+++ b/src/test/java/org/apache/maven/plugin/resources/remote/RemoteResourcesMojoTest.java
@@ -22,47 +22,38 @@
 import org.apache.maven.artifact.DefaultArtifact;
 import org.apache.maven.artifact.handler.DefaultArtifactHandler;
 import org.apache.maven.artifact.repository.ArtifactRepository;
-import org.apache.maven.artifact.repository.LegacyLocalRepositoryManager;
 import org.apache.maven.artifact.versioning.VersionRange;
 import org.apache.maven.execution.DefaultMavenExecutionRequest;
 import org.apache.maven.execution.DefaultMavenExecutionResult;
 import org.apache.maven.execution.MavenSession;
-import org.apache.maven.execution.ReactorManager;
 import org.apache.maven.plugin.resources.remote.stub.MavenProjectBuildStub;
 import org.apache.maven.plugin.resources.remote.stub.MavenProjectResourcesStub;
 import org.apache.maven.plugin.testing.AbstractMojoTestCase;
-import org.apache.maven.project.DefaultProjectBuildingRequest;
 import org.apache.maven.project.MavenProject;
-import org.apache.maven.project.ProjectBuildingRequest;
 import org.apache.maven.repository.internal.MavenRepositorySystemUtils;
-import org.codehaus.plexus.DefaultPlexusContainer;
-import org.codehaus.plexus.logging.console.ConsoleLoggerManager;
 import org.codehaus.plexus.util.FileUtils;
 
 import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
 import java.io.InputStream;
+import java.io.OutputStream;
 import java.net.URL;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Calendar;
-import java.util.Properties;
+import java.util.Collections;
 import java.util.jar.JarOutputStream;
 import java.util.zip.ZipEntry;
 import org.codehaus.plexus.util.IOUtil;
 import org.eclipse.aether.DefaultRepositorySystemSession;
-import org.eclipse.aether.RepositorySystemSession;
-import org.eclipse.aether.internal.impl.EnhancedLocalRepositoryManagerFactory;
 import org.eclipse.aether.internal.impl.SimpleLocalRepositoryManagerFactory;
 import org.eclipse.aether.repository.LocalRepository;
-import org.eclipse.aether.repository.LocalRepositoryManager;
 
 
 /**
  * RemoteResources plugin Test Case
  */
-
 public class RemoteResourcesMojoTest
     extends AbstractMojoTestCase
 {
@@ -256,12 +247,12 @@
         file = new File( file, "UTF-8.bin" );
         assertTrue( file.exists() );
 
-        InputStream in = new FileInputStream( file );
-        byte[] data = IOUtil.toByteArray( in );
-        in.close();
-
-        byte[] expected = "\u00E4\u00F6\u00FC\u00C4\u00D6\u00DC\u00DF".getBytes( "UTF-8" );
-        assertTrue( Arrays.equals( expected, data ) );
+        try (InputStream in = Files.newInputStream( file.toPath( ) ) )
+        {
+            byte[] data = IOUtil.toByteArray( in );
+            byte[] expected = "\u00E4\u00F6\u00FC\u00C4\u00D6\u00DC\u00DF".getBytes( StandardCharsets.UTF_8 );
+            assertTrue( Arrays.equals( expected, data ) );
+        }
     }
 
     public void testVelocityISO88591()
@@ -297,12 +288,13 @@
         file = new File( file, "ISO-8859-1.bin" );
         assertTrue( file.exists() );
 
-        InputStream in = new FileInputStream( file );
-        byte[] data = IOUtil.toByteArray( in );
-        in.close();
+        try (InputStream in = Files.newInputStream( file.toPath() ) )
+        {
+            byte[] data = IOUtil.toByteArray( in );
+            byte[] expected = "\u00E4\u00F6\u00FC\u00C4\u00D6\u00DC\u00DF".getBytes( StandardCharsets.ISO_8859_1 );
+            assertTrue( Arrays.equals( expected, data ) );
+        }
 
-        byte[] expected = "\u00E4\u00F6\u00FC\u00C4\u00D6\u00DC\u00DF".getBytes( "ISO-8859-1" );
-        assertTrue( Arrays.equals( expected, data ) );
     }
 
     public void testFilteredBundles()
@@ -386,7 +378,7 @@
 
     protected void buildResourceBundle( String id,
                                        String sourceEncoding,
-                                       String resourceNames[],
+                                       String[] resourceNames,
                                        File jarName )
     throws Exception
     {
@@ -418,21 +410,24 @@
 
         if ( null != jarName )
         {
-            JarOutputStream jar = new JarOutputStream( new FileOutputStream( jarName ) );
-            jar.putNextEntry( new ZipEntry( "META-INF/maven/remote-resources.xml" ) );
-            jar.write( data.getBytes() );
-            jar.closeEntry();
-
-            for ( String resourceName : resourceNames )
+            try ( OutputStream fos = Files.newOutputStream( jarName.toPath() );
+                  JarOutputStream jar = new JarOutputStream( fos ) )
             {
-                File resource = new File( resourceDir, resourceName );
-                InputStream in = new FileInputStream( resource );
-                jar.putNextEntry( new ZipEntry( resourceName ) );
-                IOUtil.copy( in, jar );
+                jar.putNextEntry( new ZipEntry( "META-INF/maven/remote-resources.xml" ) );
+                jar.write( data.getBytes() );
                 jar.closeEntry();
-                in.close();
+
+                for ( String resourceName : resourceNames )
+                {
+                    File resource = new File( resourceDir, resourceName );
+                    try ( InputStream in = Files.newInputStream( resource.toPath() ) )
+                    {
+                        jar.putNextEntry( new ZipEntry( resourceName ) );
+                        IOUtil.copy( in, jar );
+                        jar.closeEntry();
+                    }
+                }
             }
-            jar.close();
         }
     }
 
@@ -500,7 +495,7 @@
 
 
     protected ProcessRemoteResourcesMojo lookupProcessMojoWithSettings( final MavenProject project,
-                                                                 String bundles[] )
+                                                                 String[] bundles )
         throws Exception
     {
         return lookupProcessMojoWithSettings( project, new ArrayList<>( Arrays.asList( bundles ) ) );
@@ -522,11 +517,11 @@
         request = new DefaultMavenExecutionRequest();
         request.setUserProperties( null );
         request.setLocalRepository( localRepository );
-        request.setGoals( Arrays.asList( "install" ) );
+        request.setGoals(Collections.singletonList( "install" ) );
         request.setBaseDirectory( project.getBasedir() );
         request.setStartTime( Calendar.getInstance().getTime() );
         MavenSession session = new MavenSession( getContainer(), reposession, request, new DefaultMavenExecutionResult() );
-        session.setProjects( Arrays.asList( project ) );
+        session.setProjects( Collections.singletonList( project ) );
 
         setVariableValueToObject( mojo, "project", project );
         setVariableValueToObject( mojo, "outputDirectory", new File( project.getBuild().getOutputDirectory() ) );
@@ -540,6 +535,6 @@
     protected ProcessRemoteResourcesMojo lookupProcessMojoWithDefaultSettings( final MavenProject project )
         throws Exception
     {
-        return lookupProcessMojoWithSettings( project, new ArrayList<String>() );
+        return lookupProcessMojoWithSettings( project, new ArrayList<>() );
     }
 }
