noClassDefFound error on ftp client: org.apache.commons.net.ftp.FTPClient

14,011

Add commons-net-3.1.jar File in the libs folder of your Application. click here

Share:
14,011
Sam Bevins
Author by

Sam Bevins

Intern at the Air Force Research Lab (AFRL) in Dayton, Ohio.

Updated on June 04, 2022

Comments

  • Sam Bevins
    Sam Bevins almost 2 years

    I am working on an app that sends files to a url database. I am starting with just trying to send a picture. Currently I am getting a noclassDefFound error in my java. I have tried updating java, deleting and adding the jar files again, and I double checked my manifest for the proper permissions so I am coming here for help. I am posting the LogCat but I narrowed the problem to two lines of code: 24 in the FTP class and 82 in the uploadmedia class. I am also including the classes in question and my manifest.

    LogCat

        10-04 11:33:36.028: E/AndroidRuntime(5013): FATAL EXCEPTION: main
    10-04 11:33:36.028: E/AndroidRuntime(5013): java.lang.NoClassDefFoundError: org.apache.commons.net.ftp.FTPClient
    10-04 11:33:36.028: E/AndroidRuntime(5013):     at com.cameratest.UploadFTP.FTPUpload(UploadFTP.java:23)
    10-04 11:33:36.028: E/AndroidRuntime(5013):     at com.cameratest.UploadMedia.onActivityResult(UploadMedia.java:80)
    10-04 11:33:36.028: E/AndroidRuntime(5013):     at android.app.Activity.dispatchActivityResult(Activity.java:5192)
    10-04 11:33:36.028: E/AndroidRuntime(5013):     at android.app.ActivityThread.deliverResults(ActivityThread.java:3137)
    10-04 11:33:36.028: E/AndroidRuntime(5013):     at android.app.ActivityThread.handleSendResult(ActivityThread.java:3184)
    10-04 11:33:36.028: E/AndroidRuntime(5013):     at android.app.ActivityThread.access$1100(ActivityThread.java:130)
    10-04 11:33:36.028: E/AndroidRuntime(5013):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1243)
    10-04 11:33:36.028: E/AndroidRuntime(5013):     at android.os.Handler.dispatchMessage(Handler.java:99)
    10-04 11:33:36.028: E/AndroidRuntime(5013):     at android.os.Looper.loop(Looper.java:137)
    10-04 11:33:36.028: E/AndroidRuntime(5013):     at android.app.ActivityThread.main(ActivityThread.java:4745)
    10-04 11:33:36.028: E/AndroidRuntime(5013):     at java.lang.reflect.Method.invokeNative(Native Method)
    10-04 11:33:36.028: E/AndroidRuntime(5013):     at java.lang.reflect.Method.invoke(Method.java:511)
    10-04 11:33:36.028: E/AndroidRuntime(5013):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
    10-04 11:33:36.028: E/AndroidRuntime(5013):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
    10-04 11:33:36.028: E/AndroidRuntime(5013):     at dalvik.system.NativeStart.main(Native Method)
    

    Manifest

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.cameratest"
        android:versionCode="1"
        android:versionName="1.0" >
    
        <uses-sdk
            android:minSdkVersion="8"
            android:targetSdkVersion="15" />
    
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.RECORD_AUDIO" />
        <uses-permission android:name="android.permission.CAMERA" />
        <uses-permission android:name="android.permission.RECORD_VIDEO" />
        <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    
        <uses-feature android:name="android.hardware.camera" />
        <uses-feature android:name="android.hardware.camera.autofocus" />
    
        <application
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
            <activity
                android:name=".Main"
                android:label="@string/title_activity_main" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
            <activity
                android:name="sate2012.avatar.android.UploadMedia"
                android:label="@string/app_name"
                android:screenOrientation="landscape" >
            </activity>
            <activity
                android:name="sate2012.avatar.android.MailSenderActivity"
                android:label="Upload Data Point" >
                <intent-filter>
                    <action android:name="android.intent.action.MAILSENDERACTIVITY" />
    
                    <category android:name="android.intent.category.DEFAULT" />
                </intent-filter>
            </activity>
            <activity
                android:name="sate2012.avatar.android.GMailSender"
                android:label="@string/title_mail_sender_activity"
                android:screenOrientation="landscape" >
                <intent-filter>
                    <action android:name="sate2012.avatar.android.GMAILSENDER" />
    
                    <category android:name="android.intent.category.DEFAULT" />
                </intent-filter>
            </activity>
            <activity
                android:name="sate2012.avatar.android.UploadData"
                android:label="UploadData" >
                <intent-filter>
                    <action android:name="sate2012.avatar.android.UPLOADDATA" />
    
                    <category android:name="android.intent.category.DEFAULT" />
                </intent-filter>
            </activity>
            <activity
                android:name=".UploadMedia"
                android:label="@string/app_name" >
                <intent-filter>
                    <action android:name="android.intent.action.UPLOAD_MEDIA" />
    
                    <category android:name="android.intent.category.DEFAULT" />
                </intent-filter>
            </activity>
            <activity
                android:name=".Photographer"
                android:label="photoclass" >
                <intent-filter>
                    <action android:name="android.intent.action.PHOTOGRAPHER" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
            <activity
                android:name=".UploadFTP"
                android:label="photoclass" >
                <intent-filter>
                    <action android:name="android.intent.action.UPLOAD_FTP" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    
    </manifest>
    

    FTP class

    package com.cameratest;
    
    import android.os.Bundle;
    import android.os.Handler;
    import android.app.Activity;
    import android.content.Context;
    import java.io.IOException;
    import java.io.BufferedInputStream;
    import java.io.FileInputStream;
    import java.net.InetAddress;
    import org.apache.commons.net.ftp.FTPClient;
    
    
    public class UploadFTP extends Activity {
    
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
        }
    
        public static String FTPUpload(String filepath, String extension, Context thisContext) {
            FTPClient ftpClient = new FTPClient();
            long time = (System.currentTimeMillis());
            String filename = "T" + time;
            try {
                ftpClient.connect(InetAddress.getByName("24.123.68.146"));
                ftpClient.login("opensim", "widdlyscuds");
                ftpClient.changeWorkingDirectory("../../var/www/avatar/Uploaded");
                if (ftpClient.getReplyString().contains("250")) {
                    Handler progressHandler = new Handler();
                    ftpClient.setFileType(org.apache.commons.net.ftp.FTP.BINARY_FILE_TYPE);
                    BufferedInputStream buffIn = null;
                    buffIn = new BufferedInputStream(new FileInputStream(filepath));
                    ftpClient.enterLocalPassiveMode();
                    ProgressInputStream progressInput = new ProgressInputStream(buffIn, progressHandler);
                    ftpClient.storeFile(filename + extension, progressInput);
                    buffIn.close();
                    ftpClient.logout();
                    ftpClient.disconnect();
                }
            } catch (IOException e) {
            }
            return filename + extension;
        }
    }
    

    upload media: calls ftp class

    package com.cameratest;
    
    
    import java.io.File;
    
    import android.app.Activity;
    import android.content.Context;
    import android.content.Intent;
    import android.content.pm.ActivityInfo;
    import android.os.Bundle;
    import android.os.Environment;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.ImageButton;
    
    /**
     * The Upload Menu Allows the user to select different media types to upload to
     * the server
     */
    public class UploadMedia extends Activity implements OnClickListener {
        private File sd;
        private File storageFolder;
        private File mediaFolder;
        private ImageButton pictureB;
        private String dataType;
        private String media_filepath;
        private String media_filename;
        private String media_extension;
        private static String image_filepath;
        public static Context thisContext;
    
        /**
         * Called when the activity is first created.
         */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            thisContext = getApplicationContext();
            setContentView(R.layout.upload_menu);
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
            createStorageDirectory();
            pictureB = (ImageButton) findViewById(R.id.cameraButton);
            pictureB.setOnClickListener(this);
    
        }
    
        /**
         * Responds to whatever button is pressed
         * 
         * @param View
         *            v - the button clicked
         */
        public void onClick(View v) {
            Intent i;
            switch (v.getId()) {
            case (R.id.cameraButton):
                dataType = getResources().getString(R.string.type_picture);
                i = new Intent(UploadMedia.this, Photographer.class);
                startActivityForResult(i, Globals.CAMERA_REQUEST);
                break;
            }
        }
    
        public void onBackPressed() {
            finish();
        }
    
        /**
         * Called when the individual activities (picture, video, audio) finish.
         */
        @Override
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
            // super.onActivityResult(requestCode, resultCode, data);
            if (resultCode == Activity.RESULT_OK) {
    
                if (requestCode == Globals.CAMERA_REQUEST) {
                    media_filepath = getImage_filepath();
                    media_extension = "_P.png";
                }
                media_filename = UploadFTP.FTPUpload(media_filepath,
                        media_extension, thisContext);
                Intent MailIntent = new Intent(getApplicationContext(),
                        MailSenderActivity.class);
                MailIntent.putExtra("Type", dataType);
                MailIntent.putExtra("Filename", media_filename);
                startActivity(MailIntent);
                finish();
            }
        }
    
        public static void setImage_filepath(String fp) {
            image_filepath = fp;
        }
    
        public String getImage_filepath() {
            return image_filepath;
        }
    
        @Override
        public void onDestroy() {
            finish();
            super.onDestroy();
        }
    
        public void createStorageDirectory() {
            sd = Environment.getExternalStorageDirectory();
            storageFolder = new File(sd, Globals.STORAGE_DIRECTORY);
            if (sd.canWrite()) {
                if (!storageFolder.exists())
                    storageFolder.mkdir();
                mediaFolder = new File(sd, Globals.STORAGE_DIRECTORY
                        + Globals.MEDIA_DIRECTORY);
                if (!mediaFolder.exists())
                    mediaFolder.mkdir();
            }
        }
    }