diff --git a/src/main/org/apache/ant/compress/resources/ArFileSet.java b/src/main/org/apache/ant/compress/resources/ArFileSet.java
index 282d9ce..d78a8fd 100644
--- a/src/main/org/apache/ant/compress/resources/ArFileSet.java
+++ b/src/main/org/apache/ant/compress/resources/ArFileSet.java
@@ -73,6 +73,7 @@
     protected ArchiveScanner newArchiveScanner() {
         return new CommonsCompressArchiveScanner(new ArStreamFactory(),
                                                  new CommonsCompressArchiveScanner.ResourceBuilder() {
+                @Override
                 public Resource buildResource(Resource archive, String encoding,
                                               ArchiveEntry entry) {
                     return new ArResource(archive, (ArArchiveEntry) entry);
diff --git a/src/main/org/apache/ant/compress/resources/ArjFileSet.java b/src/main/org/apache/ant/compress/resources/ArjFileSet.java
index ee12fe4..78d34c9 100644
--- a/src/main/org/apache/ant/compress/resources/ArjFileSet.java
+++ b/src/main/org/apache/ant/compress/resources/ArjFileSet.java
@@ -75,6 +75,7 @@
         CommonsCompressArchiveScanner cs =
             new CommonsCompressArchiveScanner(new ArjStreamFactory(),
                                               new CommonsCompressArchiveScanner.ResourceBuilder() {
+                @Override
                 public Resource buildResource(Resource archive, String encoding,
                                               ArchiveEntry entry) {
                     return new ArjResource(archive, encoding, (ArjArchiveEntry) entry);
diff --git a/src/main/org/apache/ant/compress/resources/CpioFileSet.java b/src/main/org/apache/ant/compress/resources/CpioFileSet.java
index 49f4c90..b4138d2 100644
--- a/src/main/org/apache/ant/compress/resources/CpioFileSet.java
+++ b/src/main/org/apache/ant/compress/resources/CpioFileSet.java
@@ -74,6 +74,7 @@
         CommonsCompressArchiveScanner cs =
             new CommonsCompressArchiveScanner(new CpioStreamFactory(),
                                               new CommonsCompressArchiveScanner.ResourceBuilder() {
+                @Override
                 public Resource buildResource(Resource archive, String encoding,
                                               ArchiveEntry entry) {
                     return new CpioResource(archive, encoding, (CpioArchiveEntry) entry);
diff --git a/src/main/org/apache/ant/compress/resources/DumpFileSet.java b/src/main/org/apache/ant/compress/resources/DumpFileSet.java
index 134a501..81cbb42 100644
--- a/src/main/org/apache/ant/compress/resources/DumpFileSet.java
+++ b/src/main/org/apache/ant/compress/resources/DumpFileSet.java
@@ -75,6 +75,7 @@
         CommonsCompressArchiveScanner cs =
             new CommonsCompressArchiveScanner(new DumpStreamFactory(),
                                               new CommonsCompressArchiveScanner.ResourceBuilder() {
+                @Override
                 public Resource buildResource(Resource archive, String encoding,
                                               ArchiveEntry entry) {
                     return new DumpResource(archive, encoding, (DumpArchiveEntry) entry);
diff --git a/src/main/org/apache/ant/compress/resources/SevenZResource.java b/src/main/org/apache/ant/compress/resources/SevenZResource.java
index 9a5d25d..379248c 100644
--- a/src/main/org/apache/ant/compress/resources/SevenZResource.java
+++ b/src/main/org/apache/ant/compress/resources/SevenZResource.java
@@ -120,15 +120,19 @@
         while (ze != null) {
             if (ze.getName().equals(getName())) {
                 return new InputStream() {
+                    @Override
                     public int read() throws IOException {
                         return z.read();
                     }
+                    @Override
                     public int read(byte[] b) throws IOException {
                         return z.read(b);
                     }
+                    @Override
                     public void close() throws IOException {
                         z.close();
                     }
+                    @Override
                     protected void finalize() throws Throwable {
                         try {
                             close();
diff --git a/src/main/org/apache/ant/compress/resources/SevenZScanner.java b/src/main/org/apache/ant/compress/resources/SevenZScanner.java
index 8c954ec..3e3c8f4 100644
--- a/src/main/org/apache/ant/compress/resources/SevenZScanner.java
+++ b/src/main/org/apache/ant/compress/resources/SevenZScanner.java
@@ -47,6 +47,7 @@
     public SevenZScanner(boolean skipUnreadable, Project project) {
         super(new SevenZStreamFactory(),
               new CommonsCompressArchiveScanner.ResourceBuilder() {
+                @Override
                 public Resource buildResource(Resource archive, String encoding,
                                               ArchiveEntry entry) {
                     return new SevenZResource(archive, encoding,
diff --git a/src/main/org/apache/ant/compress/resources/TarFileSet.java b/src/main/org/apache/ant/compress/resources/TarFileSet.java
index a5b2439..d17f09a 100644
--- a/src/main/org/apache/ant/compress/resources/TarFileSet.java
+++ b/src/main/org/apache/ant/compress/resources/TarFileSet.java
@@ -139,6 +139,7 @@
         CommonsCompressArchiveScanner cs =
             new CommonsCompressArchiveScanner(new TarStreamFactory(),
                                                  new CommonsCompressArchiveScanner.ResourceBuilder() {
+                @Override
                 public Resource buildResource(Resource archive, String encoding,
                                               ArchiveEntry entry) {
                     return new TarResource(archive, encoding,
diff --git a/src/main/org/apache/ant/compress/resources/ZipResource.java b/src/main/org/apache/ant/compress/resources/ZipResource.java
index a8ab509..3fca5d4 100644
--- a/src/main/org/apache/ant/compress/resources/ZipResource.java
+++ b/src/main/org/apache/ant/compress/resources/ZipResource.java
@@ -125,10 +125,12 @@
                                      + getArchive());
         }
         return new FilterInputStream(z.getInputStream(ze)) {
+            @Override
             public void close() throws IOException {
                 FileUtils.close(in);
                 z.close();
             }
+            @Override
             protected void finalize() throws Throwable {
                 try {
                     close();
diff --git a/src/main/org/apache/ant/compress/resources/ZipScanner.java b/src/main/org/apache/ant/compress/resources/ZipScanner.java
index d194f36..34fbf03 100644
--- a/src/main/org/apache/ant/compress/resources/ZipScanner.java
+++ b/src/main/org/apache/ant/compress/resources/ZipScanner.java
@@ -47,6 +47,7 @@
     public ZipScanner(boolean skipUnreadable, Project project) {
         super(new ZipStreamFactory(),
               new CommonsCompressArchiveScanner.ResourceBuilder() {
+                @Override
                 public Resource buildResource(Resource archive, String encoding,
                                             ArchiveEntry entry) {
                     return new ZipResource(archive, encoding,
diff --git a/src/main/org/apache/ant/compress/taskdefs/Ar.java b/src/main/org/apache/ant/compress/taskdefs/Ar.java
index dbb57a4..4089062 100644
--- a/src/main/org/apache/ant/compress/taskdefs/Ar.java
+++ b/src/main/org/apache/ant/compress/taskdefs/Ar.java
@@ -43,6 +43,7 @@
 
     public Ar() {
         setFactory(new ArStreamFactory() {
+                @Override
                 public ArchiveOutputStream getArchiveStream(OutputStream stream,
                                                             String encoding)
                     throws IOException {
@@ -57,6 +58,7 @@
             });
         setEntryBuilder(
               new ArchiveBase.EntryBuilder() {
+                @Override
                 public ArchiveEntry buildEntry(ArchiveBase.ResourceWithFlags r) {
                     boolean isDir = r.getResource().isDirectory();
                     if (isDir) {
@@ -93,6 +95,7 @@
                 }
             });
         setFileSetBuilder(new ArchiveBase.FileSetBuilder() {
+                @Override
                 public ArchiveFileSet buildFileSet(Resource dest) {
                     ArchiveFileSet afs = new ArFileSet();
                     afs.setSrcResource(dest);
@@ -136,10 +139,12 @@
             setValue(AR_NAME);
         }
 
+        @Override
         public String[] getValues() {
             return new String[] {AR_NAME, BSD_NAME};
         }
 
+        @Override
         public boolean equals(Object other) {
             return other instanceof Format
                 && ((Format) other).getValue().equals(getValue());
diff --git a/src/main/org/apache/ant/compress/taskdefs/ArchiveBase.java b/src/main/org/apache/ant/compress/taskdefs/ArchiveBase.java
index 74e34fc..acbc24b 100644
--- a/src/main/org/apache/ant/compress/taskdefs/ArchiveBase.java
+++ b/src/main/org/apache/ant/compress/taskdefs/ArchiveBase.java
@@ -508,6 +508,7 @@
      */
     protected void sort(List/*<ResourceWithFlags>*/ l) {
         Collections.sort(l, new Comparator/*<ResourceWithFlags>*/() {
+                @Override
                 public int compare(Object o1, Object o2) {
                     ResourceWithFlags r1 = (ResourceWithFlags) o1;
                     ResourceWithFlags r2 = (ResourceWithFlags) o2;
diff --git a/src/main/org/apache/ant/compress/taskdefs/BZip2.java b/src/main/org/apache/ant/compress/taskdefs/BZip2.java
index a92cb33..4210227 100644
--- a/src/main/org/apache/ant/compress/taskdefs/BZip2.java
+++ b/src/main/org/apache/ant/compress/taskdefs/BZip2.java
@@ -31,10 +31,11 @@
     public BZip2() {
         super(new BZip2StreamFactory(),
               new PackBase.ResourceWrapper() {
+                @Override
                 public CommonsCompressCompressorResource wrap(Resource dest) {
                     return new BZip2Resource(dest);
                 }
             });
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/main/org/apache/ant/compress/taskdefs/Cpio.java b/src/main/org/apache/ant/compress/taskdefs/Cpio.java
index 0706ea8..2c5e1a9 100644
--- a/src/main/org/apache/ant/compress/taskdefs/Cpio.java
+++ b/src/main/org/apache/ant/compress/taskdefs/Cpio.java
@@ -41,6 +41,7 @@
 
     public Cpio() {
         setFactory(new CpioStreamFactory() {
+                @Override
                 public ArchiveOutputStream getArchiveStream(OutputStream stream,
                                                             String encoding)
                     throws IOException {
@@ -52,6 +53,7 @@
             });
         setEntryBuilder(
               new ArchiveBase.EntryBuilder() {
+                @Override
                 public ArchiveEntry buildEntry(ArchiveBase.ResourceWithFlags r) {
                     boolean isDir = r.getResource().isDirectory();
                     CpioArchiveEntry ent =
@@ -91,6 +93,7 @@
                 }
             });
         setFileSetBuilder(new ArchiveBase.FileSetBuilder() {
+                @Override
                 public ArchiveFileSet buildFileSet(Resource dest) {
                     ArchiveFileSet afs = new CpioFileSet();
                     afs.setSrcResource(dest);
@@ -142,6 +145,7 @@
             setValue(BINARY_NAME);
         }
 
+        @Override
         public String[] getValues() {
             return new String[] {
                 BINARY_NAME, OLD_ASCII_NAME, ODC_NAME, NEW_ASCII_NAME, //CRC_NAME
diff --git a/src/main/org/apache/ant/compress/taskdefs/GZip.java b/src/main/org/apache/ant/compress/taskdefs/GZip.java
index 97b9b00..ba7709d 100644
--- a/src/main/org/apache/ant/compress/taskdefs/GZip.java
+++ b/src/main/org/apache/ant/compress/taskdefs/GZip.java
@@ -38,11 +38,13 @@
 
     public GZip() {
         super(new PackBase.ResourceWrapper() {
+                @Override
                 public CommonsCompressCompressorResource wrap(Resource dest) {
                     return new GZipResource(dest);
                 }
             });
         setFactory(new GZipStreamFactory() {
+                @Override
                 public CompressorOutputStream getCompressorStream(OutputStream stream)
                     throws IOException {
                     GzipParameters params = new GzipParameters();
diff --git a/src/main/org/apache/ant/compress/taskdefs/LZMA.java b/src/main/org/apache/ant/compress/taskdefs/LZMA.java
index ca98412..d25b1c7 100644
--- a/src/main/org/apache/ant/compress/taskdefs/LZMA.java
+++ b/src/main/org/apache/ant/compress/taskdefs/LZMA.java
@@ -32,6 +32,7 @@
     public LZMA() {
         super(new LZMAStreamFactory(),
               new PackBase.ResourceWrapper() {
+                @Override
                 public CommonsCompressCompressorResource wrap(Resource dest) {
                     return new LZMAResource(dest);
                 }
diff --git a/src/main/org/apache/ant/compress/taskdefs/Pack200.java b/src/main/org/apache/ant/compress/taskdefs/Pack200.java
index 83e30d3..1908377 100644
--- a/src/main/org/apache/ant/compress/taskdefs/Pack200.java
+++ b/src/main/org/apache/ant/compress/taskdefs/Pack200.java
@@ -46,11 +46,13 @@
 
     public Pack200() {
         super(new PackBase.ResourceWrapper() {
+                @Override
                 public CommonsCompressCompressorResource wrap(Resource dest) {
                     return new Pack200Resource(dest);
                 }
             });
         setFactory(new CompressorStreamFactory() {
+                @Override
                 public CompressorOutputStream
                     getCompressorStream(OutputStream stream)
                     throws IOException {
@@ -59,6 +61,7 @@
                                                              .getStrategy(),
                                                              properties);
                 }
+                @Override
                 public CompressorInputStream
                     getCompressorStream(InputStream stream)
                     throws IOException {
@@ -97,6 +100,7 @@
             STRATEGIES.put(TEMP_FILE_KEY, Pack200Strategy.TEMP_FILE);
         }
 
+        @Override
         public String[] getValues() {
             return new String[] {IN_MEMORY_KEY, TEMP_FILE_KEY};
         }
diff --git a/src/main/org/apache/ant/compress/taskdefs/SevenZ.java b/src/main/org/apache/ant/compress/taskdefs/SevenZ.java
index 99b72de..e4bee13 100644
--- a/src/main/org/apache/ant/compress/taskdefs/SevenZ.java
+++ b/src/main/org/apache/ant/compress/taskdefs/SevenZ.java
@@ -48,6 +48,7 @@
 
     public SevenZ() {
         setFactory(new SevenZStreamFactory() {
+                @Override
                 public ArchiveOutputStream getArchiveOutputStream(File f,
                                                                   String encoding)
                     throws IOException {
@@ -64,6 +65,7 @@
             });
         setEntryBuilder(
               new ArchiveBase.EntryBuilder() {
+                @Override
                 public ArchiveEntry buildEntry(ArchiveBase.ResourceWithFlags r) {
                     SevenZArchiveEntry entry = new SevenZArchiveEntry();
                     entry.setName(r.getName());
@@ -80,6 +82,7 @@
                 }
             });
         setFileSetBuilder(new ArchiveBase.FileSetBuilder() {
+                @Override
                 public ArchiveFileSet buildFileSet(Resource dest) {
                     ArchiveFileSet afs = new SevenZFileSet();
                     afs.setSrcResource(dest);
diff --git a/src/main/org/apache/ant/compress/taskdefs/Tar.java b/src/main/org/apache/ant/compress/taskdefs/Tar.java
index 4e59d02..b01a512 100644
--- a/src/main/org/apache/ant/compress/taskdefs/Tar.java
+++ b/src/main/org/apache/ant/compress/taskdefs/Tar.java
@@ -39,6 +39,7 @@
 
     public Tar() {
         setFactory(new TarStreamFactory(){
+                @Override
                 public ArchiveOutputStream getArchiveStream(OutputStream stream,
                                                             String encoding)
                     throws IOException {
@@ -69,6 +70,7 @@
             });
         setEntryBuilder(
               new ArchiveBase.EntryBuilder() {
+                @Override
                 public ArchiveEntry buildEntry(ArchiveBase.ResourceWithFlags r) {
                     boolean isDir = r.getResource().isDirectory();
                     String name = r.getName();
@@ -124,6 +126,7 @@
                 }
             });
         setFileSetBuilder(new ArchiveBase.FileSetBuilder() {
+                @Override
                 public ArchiveFileSet buildFileSet(Resource dest) {
                     ArchiveFileSet afs = new TarFileSet();
                     afs.setSrcResource(dest);
@@ -163,6 +166,7 @@
             setValue(USTAR_NAME);
         }
 
+        @Override
         public String[] getValues() {
             return new String[] {
                 USTAR_NAME, OLDGNU_NAME, GNU_NAME,
@@ -175,4 +179,4 @@
                 && ((Format) other).getValue().equals(getValue());
         }
     }
-}
\ No newline at end of file
+}
diff --git a/src/main/org/apache/ant/compress/taskdefs/Un7z.java b/src/main/org/apache/ant/compress/taskdefs/Un7z.java
index 8adfb06..3fa4e74 100644
--- a/src/main/org/apache/ant/compress/taskdefs/Un7z.java
+++ b/src/main/org/apache/ant/compress/taskdefs/Un7z.java
@@ -68,12 +68,14 @@
                 */
                 log("extracting " + ze.getName(), Project.MSG_DEBUG);
                 try (InputStream is = new InputStream() {
-                         public int read() throws IOException {
-                             return zf.read();
-                         }
-                         public int read(byte[] b) throws IOException {
-                             return zf.read(b);
-                         }
+                        @Override
+                        public int read() throws IOException {
+                            return zf.read();
+                        }
+                        @Override
+                        public int read(byte[] b) throws IOException {
+                            return zf.read(b);
+                        }
                     }) {
                     extractFile(fileUtils, srcF, dir, is,
                                 ze.getName(), ze.getLastModifiedDate(),
diff --git a/src/main/org/apache/ant/compress/taskdefs/UnPack200.java b/src/main/org/apache/ant/compress/taskdefs/UnPack200.java
index 0877f1d..8342928 100644
--- a/src/main/org/apache/ant/compress/taskdefs/UnPack200.java
+++ b/src/main/org/apache/ant/compress/taskdefs/UnPack200.java
@@ -42,6 +42,7 @@
     public UnPack200() {
         super(".pack");
         setFactory(new Pack200StreamFactory() {
+                @Override
                 public CompressorInputStream
                     getCompressorStream(InputStream stream)
                     throws IOException {
@@ -50,6 +51,7 @@
                                                             .getStrategy(),
                                                             properties);
                 }
+                @Override
                 public CompressorInputStream getCompressorInputStream(File file)
                     throws IOException {
                     return new Pack200CompressorInputStream(file,
diff --git a/src/main/org/apache/ant/compress/taskdefs/XZ.java b/src/main/org/apache/ant/compress/taskdefs/XZ.java
index d9f50a8..2a6b5ac 100644
--- a/src/main/org/apache/ant/compress/taskdefs/XZ.java
+++ b/src/main/org/apache/ant/compress/taskdefs/XZ.java
@@ -32,10 +32,11 @@
     public XZ() {
         super(new XZStreamFactory(),
               new PackBase.ResourceWrapper() {
+                @Override
                 public CommonsCompressCompressorResource wrap(Resource dest) {
                     return new XZResource(dest);
                 }
             });
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/main/org/apache/ant/compress/taskdefs/Zip.java b/src/main/org/apache/ant/compress/taskdefs/Zip.java
index 2fb22cd..7a1880f 100644
--- a/src/main/org/apache/ant/compress/taskdefs/Zip.java
+++ b/src/main/org/apache/ant/compress/taskdefs/Zip.java
@@ -50,6 +50,7 @@
 
     public Zip() {
         setFactory(new ZipStreamFactory() {
+                @Override
                 public ArchiveOutputStream getArchiveStream(OutputStream stream,
                                                             String encoding)
                     throws IOException {
@@ -59,6 +60,7 @@
                     configure(o);
                     return o;
                 }
+                @Override
                 public ArchiveOutputStream getArchiveOutputStream(File f,
                                                                   String encoding)
                     throws IOException {
@@ -70,6 +72,7 @@
             });
         setEntryBuilder(
               new ArchiveBase.EntryBuilder() {
+                @Override
                 public ArchiveEntry buildEntry(ArchiveBase.ResourceWithFlags r) {
                     boolean isDir = r.getResource().isDirectory();
                     ZipArchiveEntry ent = new ZipArchiveEntry(r.getName());
@@ -104,6 +107,7 @@
                 }
             });
         setFileSetBuilder(new ArchiveBase.FileSetBuilder() {
+                @Override
                 public ArchiveFileSet buildFileSet(Resource dest) {
                     ArchiveFileSet afs = new ZipFileSet();
                     afs.setSrcResource(dest);
@@ -201,6 +205,7 @@
                          .NOT_ENCODEABLE);
         }
 
+        @Override
         public String[] getValues() {
             return new String[] {NEVER_KEY, ALWAYS_KEY, N_E_KEY};
         }
@@ -237,6 +242,7 @@
             POLICIES.put(A_N_KEY, Zip64Mode.AsNeeded);
         }
 
+        @Override
         public String[] getValues() {
             return new String[] {NEVER_KEY, ALWAYS_KEY, A_N_KEY};
         }
@@ -254,4 +260,4 @@
             return (Zip64Mode) POLICIES.get(getValue());
         }
     }
-}
\ No newline at end of file
+}
