Làm thế nào để giải quyết java.lang.NoClassDefFoundError?


220

Tôi đã thử cả hai ví dụ trong Hướng dẫn Java của Oracle . Cả hai đều biên dịch tốt, nhưng tại thời điểm chạy, cả hai đều gặp phải lỗi này:

Exception in thread "main" java.lang.NoClassDefFoundError: graphics/shapes/Square
    at Main.main(Main.java:7)
Caused by: java.lang.ClassNotFoundException: graphics.shapes.Square
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 1 more

Tôi nghĩ rằng tôi có thể có các Main.javatập tin trong thư mục sai. Đây là hệ thống phân cấp thư mục:

graphics
 Main.java
 shapes
|    Square.java
|    Triangle.java
 linepoint
|    Line.java
|    Point.java
 spaceobjects
|    Cube.java
|    RectPrism.java

Và đây là Main.java:

import graphics.shapes.*;
import graphics.linepoint.*
import graphics.spaceobjects.*;

public class Main {
    public static void main(String args[]) {
        Square s = new Square(2,3,15);
        Line l = new Line(1,5,2,3);
        Cube c = new Cube(13,32,22);
    }
}

Tôi làm gì sai ở đây?

CẬP NHẬT

Sau khi tôi đặt Mainlớp vào graphicsgói (tôi đã thêm package graphics;vào nó), đặt đường dẫn lớp thành "_test" (thư mục chứa đồ họa), biên dịch nó và chạy nó bằng cách sử dụng java graphics.Main(từ dòng lệnh), nó đã hoạt động.

CẬP NHẬT thực sự muộn # 2

Tôi đã không sử dụng Eclipse (chỉ Notepad ++ và JDK) và bản cập nhật ở trên đã giải quyết vấn đề của tôi. Tuy nhiên, dường như nhiều câu trả lời trong số này là dành cho Eclipse và IntelliJ, nhưng chúng có các khái niệm tương tự nhau.


1
Nhìn vào lớp chính của bạn, nó không nằm trong một gói (bạn sẽ có package graphics;ở trên cùng). Là graphicsngười đứng đầu cấu trúc gói của bạn? Liệu Square có package graphics.shapesở trên cùng?
tham lam

1
Bạn đang liệt kê các tệp .java ở đâu, nhưng vì những gì bạn nhận được là vấn đề thời gian chạy , điều bạn thực sự quan tâm là các tệp. Class ở đâu và liệu chúng có nằm trên đường dẫn lớp của bạn hay không. Làm thế nào bạn đang thực hiện lớp chính?
Thor84no

Chỉ cần nhấn Shift + ctrl + o trong nhật thực để tổ chức nhập khẩu của bạn
happybuddha

Hãy chắc chắn rằng bạn gõ tên lớp một cách chính xác. Tôi đã nhận được lỗi này vì tôi đã không bắt đầu tên lớp bằng một chữ cái viết hoa
Jeremy Borg

Điều này đôi khi xảy ra trong IntelliJ IDEA sau khi tái cấu trúc chính. Nhấp chuột phải vào dự án của bạn và chọn -> Compile Module , sau đó khởi động lại dự án và nó sẽ hoạt động trở lại.
Zar

Câu trả lời:


223

Sau khi bạn biên dịch mã của mình, bạn kết thúc với .classcác tệp cho mỗi lớp trong chương trình của mình. Các tệp nhị phân này là mã byte mà Java diễn giải để thực thi chương trình của bạn. Điều này NoClassDefFoundErrorchỉ ra rằng trình nạp lớp (trong trường hợp này java.net.URLClassLoader), chịu trách nhiệm tải động các lớp, không thể tìm thấy .classtệp cho lớp mà bạn đang cố sử dụng.

Mã của bạn sẽ không biên dịch nếu các lớp được yêu cầu không có mặt (trừ khi các lớp được tải với sự phản chiếu), vì vậy, thường thì ngoại lệ này có nghĩa là đường dẫn lớp của bạn không bao gồm các lớp bắt buộc. Hãy nhớ rằng trình nạp lớp (cụ thể java.net.URLClassLoader) sẽ tìm các lớp trong gói abc trong thư mục a / b / c / trong mỗi mục trong đường dẫn lớp của bạn. NoClassDefFoundErrorcũng có thể chỉ ra rằng bạn đang thiếu một phụ thuộc quá độ của tệp .jar mà bạn đã biên dịch và bạn đang cố gắng sử dụng.

Ví dụ, nếu bạn có một lớp com.example.Foo, sau khi biên dịch, bạn sẽ có một tệp lớp Foo.class. Nói ví dụ thư mục làm việc của bạn là .../project/. Tập tin lớp đó phải được đặt vào .../project/com/examplevà bạn sẽ đặt đường dẫn lớp của mình thành .../project/.

Lưu ý bên lề: Tôi khuyên bạn nên tận dụng công cụ tuyệt vời tồn tại cho các ngôn ngữ Java và JVM. Các IDE hiện đại như Eclipse và IDEA và các công cụ quản lý xây dựng như Maven hoặc Gradle sẽ giúp bạn không phải lo lắng về các đường dẫn lớp (nhiều) và tập trung vào mã! Điều đó nói rằng, liên kết này giải thích cách đặt đường dẫn lớp khi bạn thực thi trên dòng lệnh.


Tôi đang đọc điều này vì một lỗi tôi gặp phải khi cố gắng chạy thử nghiệm đơn vị trên Android. Nó chỉ ra rằng NoClassDefFoundError, trong trường hợp của tôi, xảy ra do thiếu phụ thuộc trong thử nghiệm. Tôi cần suy nghĩ về việc tiêm phụ thuộc để ngăn ngừa lỗi như thế này. Cảm ơn câu trả lời công phu.
danny điển hình

130

Tôi muốn điều chỉnh quan điểm của người khác NoClassDefFoundError.

NoClassDefFoundError có thể xảy ra vì nhiều lý do như

  1. ClassNotFoundException -. Class không được tìm thấy cho lớp được tham chiếu đó bất kể nó có sẵn tại thời gian biên dịch hay không (tức là lớp cơ sở / lớp con).
  2. Tập tin lớp được định vị, nhưng Ngoại lệ được nêu ra trong khi khởi tạo các biến tĩnh
  3. Tập tin lớp nằm, Ngoại lệ được nâng lên trong khi khởi tạo các khối tĩnh

Trong câu hỏi ban đầu, đây là trường hợp đầu tiên có thể được sửa bằng cách đặt CLASSPATH cho tệp jar của lớp tham chiếu hoặc vào thư mục gói của nó.

Điều đó có nghĩa là gì khi nói "có sẵn trong thời gian biên dịch"?

  • Lớp tham chiếu được sử dụng trong mã.
    Vd: Hai lớp, A và B (kéo dài A). Nếu B được tham chiếu trực tiếp trong mã, nó có sẵn tại thời gian biên dịch, tức là A a = new B ();

Điều đó có nghĩa là gì khi nói "không có sẵn tại thời điểm biên dịch"?

  • Lớp thời gian biên dịch và lớp thời gian chạy là khác nhau, ví dụ lớp cơ sở được tải bằng cách sử dụng tên lớp của lớp con, ví dụ Class.forName ("classname")
    Ví dụ: Hai lớp, A và B (mở rộng A). Mã có
    A a = Class.forName ("B"). NewInstance ();

Trong trường hợp của tôi, tôi đã biên dịch một lớp, họ đã chuyển nó vào một thư mục có tên là ứng dụng. Tôi đã phải thêm một dòng với package app;và biên dịch lại trước khi tôi có thể chuyển nó vào ứng dụng thư mục con.
taco

1
Ngoài 3 được liệt kê ở trên, ClassLoaders cũng có thể gây ra lỗi như vậy, về cơ bản là ClassNotFoundException, trong lớp kịch bản này có thể xuất hiện trong đường dẫn lớp nhưng cố gắng tải từ các ClassLoader khác nhau
Fahad

2 và 3 là đặc thù của trình nạp lớp. Theo javadoc, ngoại lệ chỉ dành cho lý do 1.
Samuel

1
Tôi đã thử nghiệm các trường hợp 2 và 3 trường hợp, nó không NoClassDefFoundError, nó ExceptionInInitializerError Trường hợp 2.Class tập tin nằm, nhưng ngoại lệ huy động khi khởi tạo các biến tĩnh hồ sơ vụ án 3.Class nằm, ngoại lệ huy động khi khởi tạo khối tĩnh
Michael

1
@Michael, Liên kết này nói rằng stacktrace của bạn cũng sẽ hiển thị NoClassDefFoundErrorcho trường hợp đó: archive.is/YPbYI#selection-2107.0-2115.13
Pacerier

15

NoClassDefFoundErrorcó nghĩa là lớp có mặt trong classpath tại Compile time, nhưng nó không tồn tại trong classpath tại Runtime.

Nếu bạn đang sử dụng Eclipse, hãy chắc chắn bạn có shapes, linepointsspaceobjectsnhư các mục trong .classpathtập tin.


1
Làm thế nào để xử lý điều đó trong thời gian chạy thông qua thử / bắt ?
Maveň

5
Câu trả lời này không đúng với cách bạn viết nó. Chính xác sẽ là: "MỘT nguyên nhân có thể gây ra lỗi này là ...." Nhưng có thể có những lý do khác khiến bạn gặp lỗi này, ví dụ như khi tải tệp JAR khi chạy với trình nạp lớp.
Elmue

13

nếu bạn gặp một trong những lỗi này trong khi biên dịch và chạy:

* NoClassDefFoundError

* Error: Could not find or load main class hello

* Exception in thread "main" java.lang.NoClassDefFoundError:javaTest/test/hello 
(wrong name: test/hello)
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(Unknown Source)
        at java.security.SecureClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.access$100(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)

-------------------------- GIẢI PHÁP -----------------------

vấn đề chủ yếu là trong các tổ chức gói. Bạn nên sắp xếp các lớp học của mình trong các thư mục phù hợp với phân loại gói trong mã nguồn của bạn.

On Compiling process use this command:

javac -d . [FileName.java]

To Run the class please use this command:

java [Package].[ClassName]

"-D." trong lệnh javac thực hiện thủ thuật, tạo cấu trúc thư mục của các gói thay vì đặt tất cả các tệp. class vào thư mục gốc, cảm ơn!
Jorge Sampayo

9
java.lang.NoClassDefFoundError

chỉ ra rằng, một cái gì đó đã được tìm thấy tại compXLime nhưng không phải trong thời gian chạy . có lẽ bạn chỉ cần thêm nó vào classpath.


15
Làm thế nào để làm điều đó?
Narendra Singh

phụ thuộc vào bối cảnh bạn đang yêu cầu.
sschrass

6

Không có ngoại lệ định nghĩa lớp xảy ra khi không tìm thấy lớp dự định trong Đường dẫn lớp. Tại Lớp thời gian biên dịch: Lớp được tạo từ Trình biên dịch Java, nhưng bằng cách nào đó tại thời gian chạy, lớp phụ thuộc không được tìm thấy.

Hãy đi qua một ví dụ đơn giản:

public class ClassA{
public static void main(String args[]){
     //Some gibberish Code...
     String text = ClassB.getString();
     System.out.println("Text is :" + text);
}

}

public class ClassB{
    public static String getString(){
      return "Testing Some Exception";
 }
}

Bây giờ, hãy giả sử rằng hai Mã nguồn Java ở trên được đặt trong một số Thư mục, giả sử "NoClassDefinationFoundExceptionDemo"

Bây giờ hãy mở shell (Giả sử Java đã được thiết lập chính xác)

  1. Chuyển đến Thư mục "NoClassDefinationFoundExceptionDemo"
  2. Biên dịch các tệp nguồn Java javac ClassB javac ClassA
  3. Cả hai tệp đều được biên dịch thành công và tạo các tệp Class trong cùng một thư mục với ClassA. Class và ClassB. Class
  4. Bây giờ Vì chúng tôi đang giám sát ClassPath vào thư mục làm việc hiện tại nên chúng tôi thực thi lệnh java -cp sau đây . ClassA và Nó hoạt động thành công và bạn sẽ thấy Đầu ra trong màn hình
  5. Bây giờ Hãy nói rằng, Bạn đã xóa tệp ClassB. Class khỏi Thư mục hiện tại. và bây giờ bạn thực hiện lại lệnh. java -cp. ClassA Bây giờ nó sẽ chào đón bạn với NoClassDefFoundException. như ClassB, một phụ thuộc cho ClassA không được tìm thấy trong đường dẫn lớp (tức là thư mục làm việc hiện tại).

5

NoClassDefFoundError trong Java:

Định nghĩa:

NoClassDefFoundError sẽ đến nếu một lớp có mặt trong thời gian biên dịch nhưng không có sẵn trong java classpath trong thời gian chạy. Thông thường bạn sẽ thấy dòng dưới đây trong nhật ký khi bạn nhận NoClassDefFoundError: Ngoại lệ trong luồng "chính" java.lang.NoClassDefFoundError

Nguyên nhân có thể:

  1. Lớp này không có sẵn trong Java Classpath.

  2. Bạn có thể đang chạy chương trình của mình bằng lệnh jar và lớp không được xác định trong thuộc tính ClassPath của tệp kê khai.

  3. Bất kỳ tập lệnh khởi động nào đều ghi đè biến môi trường Classpath.

  4. Bởi vì NoClassDefFoundError là một lớp con của java.lang.LinkageError, nó cũng có thể đến nếu một trong số đó phụ thuộc như thư viện riêng có thể không có sẵn.

  5. Kiểm tra java.lang.ExceptionInInitializerError trong tệp nhật ký của bạn. NoClassDefFoundError do lỗi khởi tạo tĩnh là khá phổ biến.

  6. Nếu bạn đang làm việc trong môi trường J2EE ngoài khả năng hiển thị của Class giữa nhiều Trình tải lớp cũng có thể gây ra java.lang.NoClassDefFoundError, hãy xem các ví dụ và phần kịch bản để thảo luận chi tiết.

Nghị quyết có thể:

  1. Xác minh rằng tất cả các lớp Java được yêu cầu được bao gồm trong đường dẫn lớp của ứng dụng. Lỗi phổ biến nhất là không bao gồm tất cả các lớp cần thiết, trước khi bắt đầu thực thi một ứng dụng Java có phụ thuộc vào một số thư viện bên ngoài.

  2. Classpath của ứng dụng là chính xác, nhưng biến môi trường Classpath bị ghi đè trước khi thực thi ứng dụng.

  3. Xác minh rằng ExceptionInitializerError đã nói ở trên không xuất hiện trong dấu vết ngăn xếp của ứng dụng của bạn.

Tài nguyên:

3 cách để giải quyết java.lang.NoClassDefFoundError trong Java J2EE

java.lang.NoClassDefFoundError - Cách giải quyết Không tìm thấy lỗi Def Class


3

Nếu dự án của bạn nằm trong một gói như com.blahcodevà lớp của bạn được gọi Main, các tệp được biên dịch có thể là đầu ra trong một cấu trúc thư mục như thế nào ./out/com/blahcode/Main.class. Điều này đặc biệt đúng với IntelliJ IDEA.

Khi cố gắng chạy từ shell hoặc cmd, bạn cần đến thư cdmục con chứa comthư mục con.

cd out
java -classpath . com.blahcode.Main

1

Sau khi làm việc trong một dự án NetBeans trong nhiều tháng, tôi đột nhiên nhận được tin nhắn NoClassDefFoundError ngay sau khi nhận được thông báo "Bộ nhớ thấp". Việc xây dựng lại sạch sẽ không giúp ích gì, nhưng việc đóng Netbeans hoàn toàn và mở lại dự án không có báo cáo lỗi.


1

Câu trả lời này dành riêng cho java.lang.NoClassDefFoundError xảy ra trong một dịch vụ :

Nhóm của tôi gần đây đã thấy lỗi này sau khi nâng cấp vòng / phút cung cấp dịch vụ. Vòng / phút và phần mềm bên trong của nó đã được xây dựng với Maven, vì vậy có vẻ như chúng tôi có một sự phụ thuộc thời gian biên dịch mà chưa được đưa vào vòng / phút.

Tuy nhiên, khi điều tra, lớp không tìm thấy nằm trong cùng một mô-đun với một số lớp trong theo dõi ngăn xếp. Hơn nữa, đây không phải là một mô-đun chỉ mới được thêm gần đây vào bản dựng. Những sự thật này cho thấy nó có thể không phải là vấn đề phụ thuộc Maven.

Giải pháp cuối cùng: Khởi động lại dịch vụ!

Có vẻ như việc nâng cấp vòng / phút đã vô hiệu hóa xử lý tệp của dịch vụ trên tệp jar bên dưới. Dịch vụ sau đó thấy một lớp chưa được tải vào bộ nhớ, đã tìm kiếm nó trong danh sách các tệp xử lý tệp jar của nó và không tìm thấy nó vì tệp xử lý mà nó có thể tải lớp từ đó đã bị vô hiệu. Khởi động lại dịch vụ buộc nó phải tải lại tất cả các thẻ điều khiển tệp, sau đó cho phép nó tải lớp đó không được tìm thấy trong bộ nhớ ngay sau khi nâng cấp vòng / phút.

Hy vọng rằng trường hợp cụ thể giúp một ai đó.


1

Tôi đã phải đối mặt với vấn đề ngày hôm nay. Tôi có một dự án Android và sau khi kích multidexhoạt dự án sẽ không bắt đầu nữa.

Lý do là tôi đã quên gọi phương thức multidex cụ thể cần được thêm vào Application classvà được gọi trước mọi thứ khác.

 MultiDex.install(this);

Thực hiện theo hướng dẫn này để kích hoạt multidex một cách chính xác. https://developer.android.com/studio/build/multidex.html

Bạn nên thêm những dòng này vào lớp Ứng dụng của bạn

 @Override
  protected void attachBaseContext(Context base) {
     super.attachBaseContext(base);
     MultiDex.install(this);
  }

1

Đối với dự án của tôi, điều giải quyết vấn đề là trình duyệt Chrome và chromedriver không phải là tương thích. Tôi đã có một phiên bản trình điều khiển rất cũ thậm chí không thể mở trình duyệt. Tôi vừa tải xuống phiên bản mới nhất của cả hai và vấn đề được giải quyết. Làm thế nào tôi phát hiện ra vấn đề? Bởi vì tôi đã chạy dự án của mình bằng trình điều khiển firefox gốc Selenium với phiên bản FF cũ được cài đặt sẵn với ứng dụng của tôi, tôi nhận ra rằng vấn đề là sự không tương thích giữa trình duyệt và trình điều khiển.

Hy vọng điều này có thể giúp bất cứ ai có vấn đề tương tự như tôi, đã tạo ra Thông báo lỗi tương tự.


0

Hai xu của tôi trong chuỗi này:

Đảm bảo rằng đường dẫn lớp chứa đường dẫn đầy đủ ( /home/user/lib/some_lib.jarthay vì ~/lib/some_lib.jar) nếu không bạn vẫn có thể gặp NoClassDefFoundErrorlỗi.


Điều này đúng một phần, nhưng nó phức tạp hơn. 1) Bạn có thể sử dụng các đường dẫn tương đối trong đường dẫn lớp, nhưng chúng phải được JVM giải quyết ... liên quan đến thư mục hiện tại của JVM. Điều này làm cho chúng dễ vỡ . 2) Bạn có thể sử dụng ~và các ký tự meta shell khác khi đặt biến môi trường đường dẫn lớp, nhưng chỉ cung cấp cơ chế bạn đang sử dụng để đặt biến mở rộng chúng thành tên đường dẫn thực. Nếu bạn đang sử dụng bash, bạn có thể nhận được kết quả "hỗn hợp". Ví dụ, nhìn vào những gì bạn nhận được khi bạn gõ echo ~:~vào dòng lệnh. Cái đầu tiên ~được mở rộng, nhưng cái thứ hai thì không.
Stephen C

0

Tôi nhận được NoClassFoundError khi các lớp được tải bởi trình tải lớp thời gian chạy không thể truy cập các lớp đã được tải bởi trình tải gốc java. Vì các trình nạp lớp khác nhau nằm trong các miền bảo mật khác nhau (theo java), jvm sẽ không cho phép các lớp đã được tải bởi trình tải gốc được giải quyết trong không gian địa chỉ của trình tải thời gian chạy.

Chạy chương trình của bạn với 'java -javaagent: tracer.jar [ARGS java CỦA BẠN]'

Nó tạo ra kết quả đầu ra hiển thị lớp được tải và env của trình tải đã tải lớp đó. Đó là dấu vết rất hữu ích tại sao một lớp học không thể được giải quyết.

// ClassLoaderTracer.java
// From: https://blogs.oracle.com/sundararajan/entry/tracing_class_loading_1_5

import java.lang.instrument.*;
import java.security.*;

// manifest.mf
// Premain-Class: ClassLoadTracer

// jar -cvfm tracer.jar manifest.mf ClassLoaderTracer.class

// java -javaagent:tracer.jar  [...]

public class ClassLoadTracer 
{
    public static void premain(String agentArgs, Instrumentation inst) 
    {
        final java.io.PrintStream out = System.out;
        inst.addTransformer(new ClassFileTransformer() {
            public byte[] transform(ClassLoader loader, String className, Class classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {

                String pd = (null == protectionDomain) ? "null" : protectionDomain.getCodeSource().toString();
                out.println(className + " loaded by " + loader + " at " + new java.util.Date() + " in " + pd);

                // dump stack trace of the thread loading class 
                Thread.dumpStack();

                // we just want the original .class bytes to be loaded!
                // we are not instrumenting it...
                return null;
            }
        });
    }
}

0

Nó đã xảy ra với tôi trong Android Studio.

Giải pháp hiệu quả với tôi: chỉ cần khởi động lại studio.


0

Tôi gặp vấn đề tương tự với sự phát triển Android của mình khi sử dụng studio Android. Các giải pháp được cung cấp là chung chung và không giúp tôi (ít nhất là đối với tôi). Sau nhiều giờ nghiên cứu, tôi đã tìm thấy giải pháp sau đây và có thể giúp ích cho các nhà phát triển Android đang phát triển bằng android studio. sửa đổi cài đặt như bên dưới Tùy chọn -> Xây dựng, Thực thi, Triển khai -> Chạy ngay lập tức -> bỏ chọn tùy chọn đầu tiên.

Với sự thay đổi này, tôi đang hoạt động. Hy vọng điều này sẽ giúp bạn bè dev của tôi.


0

Một nguồn lỗi cho ngoại lệ này có thể xuất phát từ các định nghĩa không nhất quán cho Proguard, ví dụ như thiếu

-l LibraryJars "path.to.a.missing.jar.l Library".

Điều này giải thích tại sao quá trình biên dịch và chạy hoạt động tốt, với điều kiện là jar ở đó, trong khi dọn dẹp & xây dựng thất bại. Hãy nhớ xác định các thư viện jar mới được thêm vào trong thiết lập proguard!

Lưu ý rằng các thông báo lỗi từ Proguard thực sự không đạt tiêu chuẩn, vì chúng dễ bị nhầm lẫn với các thông báo ant tương tự đến khi không có bình. Chỉ ở dưới cùng sẽ có một gợi ý nhỏ của proguard gặp rắc rối. Do đó, khá logic khi bắt đầu tìm kiếm các lỗi classpath truyền thống, v.v., nhưng điều này sẽ vô ích.

Rõ ràng, ngoại lệ NoClassDefFound sẽ là kết quả khi chạy, ví dụ: jar thực thi kết quả được xây dựng và dựa trên sự thiếu nhất quán của proguard. Một số người gọi nó là proguard "Hell"


0

Tôi sử dụng plugin FileSync cho Eclipse để tôi có thể gỡ lỗi trực tiếp trên Tomcat và tôi đã nhận được NoClassFoundErrorvì tôi đã thêm một mục nhập đồng bộ hóa cho binthư mục trong không gian làm việc của Eclipse => classestrong metadataTomcat nhưng cũng không thêm đồng bộ hóa thư mục cho thư mục extlibtrong Eclipse=>

C:\Users\Stuart\eclipse-workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\webapps\myApp\WEB-INF\lib


0

Tôi đang phát triển một ứng dụng dựa trên Eclipse còn được gọi là RCP (Nền tảng khách hàng phong phú) . Và tôi đã phải đối mặt với vấn đề này sau khi tái cấu trúc (chuyển một lớp từ một plugIn sang một lớp mới).

Dọn dẹp dự án và cập nhật Maven không giúp được gì.

Sự cố xảy ra do Bundle-Activator chưa được cập nhật tự động. Cập nhật thủ công Bundle-Activator theo MANIFEST.MF trong PlugIn mới đã khắc phục sự cố của tôi.


0

Nếu gần đây bạn đã thêm hỗ trợ multidex trong studio android như thế này:

// To Support MultiDex
implementation 'com.android.support:multidex:1.0.1'

vì vậy giải pháp của bạn chỉ là mở rộng Từ MultiDexApplication thay vì Ứng dụng

public class MyApp extends MultiDexApplication {

0

Nếu bạn đang sử dụng nhiều hơn một mô-đun, bạn nên có

dexOptions {
    preDexLibraries = false
}

trong tập tin xây dựng của bạn.


0

Kiểm tra xem nếu bạn có một trình xử lý tĩnh trong lớp của bạn. Nếu vậy, xin hãy cẩn thận, vì chỉ có thể khởi chạy trình xử lý tĩnh trong luồng có bộ xử lý, sự cố có thể được kích hoạt theo cách này:

1. đầu tiên, tạo thể hiện của lớp trong một luồng đơn giản và bắt sự cố.

2. sau đó gọi phương thức trường của Class trong luồng chính, bạn sẽ nhận được NoClassDefFoundError.

đây là mã kiểm tra:

public class MyClass{
       private static  Handler mHandler = new Handler();
       public static int num = 0;
}

trong phương thức hoạt động chính của bạn, thêm phần mã kiểm tra:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    //test code start
    new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                MyClass myClass = new MyClass();
            } catch (Throwable e) {
                e.printStackTrace();
            }
        }
    }).start();

    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    MyClass.num = 3;
    // end of test code
}

có một cách đơn giản để sửa nó bằng handlerThread để init handler:

private static Handler mHandler;
private static HandlerThread handlerThread = new HandlerThread("newthread");
static {
    handlerThread.start();
    mHandler = new Handler(handlerThread.getLooper(), mHandlerCB);
}

0

Không sử dụng các lớp kiểm tra bên ngoài mô-đun

Tôi không có giải pháp, chỉ là một hương vị khác của trường hợp "có mặt trong quá trình biên dịch, vắng mặt trong thời gian chạy".

Tôi đã cố gắng sử dụng một phương thức rất thuận tiện từ lớp kiểm tra JUnit từ một lớp kiểm tra khác nằm trong một mô-đun khác. Điều đó là không, vì mã kiểm tra không phải là một phần của tệp được đóng gói, nhưng tôi không nhận ra vì nó xuất hiện cho lớp người dùng từ bên trong Eclipse.

Giải pháp của tôi là đặt phương thức trong một lớp tiện ích hiện có là một phần của mã sản xuất.


0

Trong môi trường của tôi, tôi gặp vấn đề này trong bài kiểm tra đơn vị. Sau khi nối thêm một thư viện phụ thuộc vào * .pom, điều đó đã được sửa.

ví dụ:

thông báo lỗi:

java.lang.NoClassDefFoundError: com/abc/def/foo/xyz/Iottt

pom:

<dependency>
    <groupId>com.abc.def</groupId>
    <artifactId>foo</artifactId>
    <scope>test</scope>
</dependency>

0

Tôi đã nhận được lỗi này sau khi thay đổi chi nhánh Git. Đối với trường hợp cụ thể của Eclipse, đã có các dòng bị bỏ lỡ trong thư mục .sinstall cho tệp org.eclipse.wst.common.component. Như bạn có thể thấy dưới đây

Khôi phục các phụ thuộc của dự án với Maven Install sẽ giúp ích.

nhập mô tả hình ảnh ở đây


-1

Nó xảy ra rất nhiều với các thiết bị genymotion của tôi. Đảm bảo rằng bạn có sẵn một lượng bộ nhớ tốt trên ổ đĩa nơi Genymotion được cài đặt.


Bạn có bất cứ tài liệu tham khảo cho điều đó?
Wai Ha Lee

Không, tôi thường xuyên hết dung lượng đĩa và trừ khi tôi giải phóng được một khoản tiền lớn + gỡ bỏ / cài đặt lại thiết bị ảo Genymotion, tôi vẫn gặp lỗi này.
totteire
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.