Tại sao tôi nhận được NoClassDefFoundError trong Java?


530

Tôi nhận được NoClassDefFoundErrorkhi tôi chạy ứng dụng Java của mình. Điều gì thường là nguyên nhân của điều này?


1
Tôi tin rằng nó cũng có thể xảy ra nếu bạn không chạy chương trình java của mình với cú pháp đúng. Chẳng hạn, bạn phải gọi lớp của bạn từ thư mục bin gốc với tên gói đầy đủ (ví dụ: my.package.myClass). Tôi sẽ cụ thể hơn nếu tôi có thể nhưng tôi không phải là một người java. Tôi chỉ nhớ làm phiền điều này một vài lần.
hadder thẳng thắn

17
@BoltClock Chúng tôi cần một câu hỏi chính tắc để chỉ ra nhiều bản sao. Tại sao không thể như vậy?
Raedwald

21
Bạn đã cân nhắc việc thay đổi câu trả lời được chấp nhận để câu trả lời mà cộng đồng thấy có giá trị hơn chưa?
Martin Smith

Câu trả lời:


264

Điều này được gây ra khi có một tệp lớp mà mã của bạn phụ thuộc vào và nó có mặt tại thời gian biên dịch nhưng không được tìm thấy trong thời gian chạy. Tìm kiếm sự khác biệt trong thời gian xây dựng và các đường dẫn lớp thời gian chạy.


1
Tôi đã có lỗi này xảy ra khi đặt một tệp nguồn dưới không gian tên / gói sai. Tôi hình dung tôi có thể đặt nó ở bất cứ đâu, và trình biên dịch rất vui. Hóa ra tôi nên siêng năng hơn để thời gian chạy cũng được hạnh phúc.
CenterOrbit

1
Tôi đã gặp lỗi này một lần khi máy chủ của tôi hết bộ nhớ trong khi tải tệp lên. Mỗi lần tôi thử tải lên, tôi sẽ gặp một lỗi khác nhau. Cuối cùng, nó nói với tôi rằng tôi không có đủ không gian.
James M. Lay

81
Câu trả lời này không nhất thiết là đúng và sẽ gây hiểu lầm cho nhiều người! Xem câu trả lời tốt hơn từ Jared dưới đây.
Dave L.

4
@DaveL. Cảm ơn! Câu trả lời của Jared với hơn 400 lượt upvote là cách dưới đây! Một câu trả lời với số phiếu -4 tăng (giảm?) Là cách trên nó. Có điều gì đó đáng nghi về logic trả lời của SO.
Saurabh Patil

1
Đây là một cú đánh dài đối với ai đó, nhưng tôi đã gặp phải lỗi này vì lớp trong câu hỏi có chứa SimpleDateFormat được khởi tạo với một ký tự không hợp lệ (tôi có chữ T ở giữa thay vì 'T').
Ryan D

818

Mặc dù có thể điều này là do sự không khớp của lớp giữa thời gian biên dịch và thời gian chạy, nhưng nó không nhất thiết phải đúng.

Điều quan trọng là phải giữ hai hoặc ba ngoại lệ khác nhau trong đầu chúng ta trong trường hợp này:

  1. java.lang.ClassNotFoundException Ngoại lệ này chỉ ra rằng lớp không được tìm thấy trên đường dẫn lớp. Điều này chỉ ra rằng chúng tôi đã cố tải định nghĩa lớp và lớp không tồn tại trên đường dẫn lớp.

  2. java.lang.NoClassDefFoundError Ngoại lệ này chỉ ra rằng JVM đã xem xét cấu trúc dữ liệu định nghĩa lớp bên trong của nó để định nghĩa một lớp và không tìm thấy nó. Điều này khác với việc nói rằng nó không thể được tải từ classpath. Thông thường, điều này chỉ ra rằng trước đây chúng tôi đã cố tải một lớp từ đường dẫn lớp, nhưng vì một số lý do không thành công - bây giờ chúng tôi đang cố gắng sử dụng lại lớp đó (và do đó cần phải tải nó, vì lần trước nó đã thất bại), nhưng chúng tôi ' thậm chí sẽ không thử tải nó, bởi vì chúng tôi đã không tải nó sớm hơn (và nghi ngờ hợp lý rằng chúng tôi sẽ lại thất bại). Lỗi trước đó có thể là ClassNotFoundException hoặc ExceptionInInialialError (chỉ ra lỗi trong khối khởi tạo tĩnh) hoặc bất kỳ vấn đề nào khác. Vấn đề là, NoClassDefFoundError không nhất thiết là một vấn đề về đường dẫn.


30
Cảm ơn vì đã đề cập đến nguyên nhân của NoClassDefFoundError, điều này đã giúp tôi rất nhiều! Trong trường hợp của tôi, một ExceptionInitializerError đã bị ném trước đó, đó là cách tôi phát hiện ra các lỗi trong các khối tĩnh.
Thomas

@Jared, Khi tôi nhận được Error: Could not find or load main class, nó sẽ được phân loại theo loại lỗi nào?
Vikram

@Pops: Làm cho ngôn ngữ dài dòng hơn để chỉ định các đối tượng của động từ "thử" :)
Jared

1
@Vikram "không thể tìm thấy hoặc tải lớp chính" không phải là ngoại lệ của Java, nó được gây ra bởi trình khởi chạy (kiểm tra JAR và thuộc tính tệp kê khai chính).
eckes

2
ClassNotFoundException cũng được ném khi một lớp có khởi tạo tĩnh gây ra lỗi hoặc ngoại lệ. Có lẽ họ nên chọn một tên khác cho sự kiện đó.
coladict

125

Đây là mã để minh họa java.lang.NoClassDefFoundError. Xin vui lòng xem câu trả lời của Jared để được giải thích chi tiết.

NoClassDefFoundErrorDemo.java

public class NoClassDefFoundErrorDemo {
    public static void main(String[] args) {
        try {
            // The following line would throw ExceptionInInitializerError
            SimpleCalculator calculator1 = new SimpleCalculator();
        } catch (Throwable t) {
            System.out.println(t);
        }
        // The following line would cause NoClassDefFoundError
        SimpleCalculator calculator2 = new SimpleCalculator();
    }

}

SimpleCalculator.java

public class SimpleCalculator {
    static int undefined = 1 / 0;
}

3
Và lý do là sau lần thử đầu tiên jvm đã biết nó sẽ không hoạt động và ném ngoại lệ khác lần thứ hai?
ikamen

@ikamen Rõ ràng nó đã lưu trữ ở đâu đó việc khởi tạo lớp không thành công SimpleCalculatorsau khi chia cho 0? Có ai đó có một tài liệu tham khảo cho các tài liệu chính thức cho hành vi này?
ᴠɪɴᴄᴇɴᴛ

4
@PhilipRego Không chắc chắn ý của bạn về một NoClassDefFoundError 'thuần túy'. Lần đầu tiên new SimpleCalculator()được gọi, bạn nhận được một ExceptionInitializerError với nguyên nhân là do ArithaturesException. Lần thứ hai bạn gọi, new SimpleCalculator()bạn nhận được NoClassDefFoundError thuần túy như mọi thứ khác. Vấn đề là bạn có thể nhận được NoClassDefFoundError vì một lý do khác ngoài SimpleCalculator. Class không có trên đường dẫn lớp khi chạy.
harperska

36

NoClassDefFoundError trong Java

Định nghĩa:

  1. Máy ảo Java không thể tìm thấy một lớp cụ thể trong thời gian chạy có sẵn tại thời gian biên dịch.

  2. 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.

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

Ví dụ:

  1. Lớp này không có trong Classpath, không có cách nào chắc chắn để biết về nó nhưng nhiều lần bạn có thể có một cái nhìn để in System.getproperty ("java. Classpath") và nó sẽ in đường dẫn lớp từ đó bạn ít nhất có thể lấy một ý tưởng về classpath thời gian chạy thực tế của bạn.
  2. Một ví dụ đơn giản về NoClassDefFoundError là lớp thuộc về tệp JAR bị thiếu hoặc JAR không được thêm vào classpath hoặc đôi khi tên của jar đã bị thay đổi bởi một người như trong trường hợp của tôi, một trong những đồng nghiệp của tôi đã đổi tibco.jar thành tibco_v3.jar và chương trình là thất bại với java.lang.NoClassDefFoundError và tôi đã tự hỏi điều gì sai.

  3. Chỉ cần thử chạy với tùy chọn classpath rõ ràng với đường dẫn lớp mà bạn nghĩ sẽ hoạt động và nếu nó hoạt động thì đó là một dấu hiệu ngắn chắc chắn rằng ai đó đang ghi đè đường dẫn java.

  4. Sự cố về quyền trên tệp JAR cũng có thể gây ra NoClassDefFoundError trong Java.
  5. Typo trên Cấu hình XML cũng có thể gây ra NoClassDefFoundError trong Java.
  6. khi lớp được biên dịch của bạn được định nghĩa trong một gói, không xuất hiện trong cùng một gói trong khi tải như trong trường hợp của JApplet, nó sẽ ném NoClassDefFoundError vào Java.

Phương pháp khả thi:

  1. Lớp này không có sẵn trong Java Classpath.
  2. 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 trong 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.
  3. 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.
  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. Bất kỳ tập lệnh khởi động nào đều ghi đè biến môi trường Classpath.
  6. 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.

Tài nguyên:

3 cách để giải quyết NoClassDefFoundError

java.lang.NoClassDefFoundError Các mẫu vấn đề


1
Câu trả lời chính xác. Tôi nghĩ rằng tôi đã thử mọi thứ bạn đề nghị và vẫn gặp phải vấn đề đó. Tôi có thể loại trừ một số trong số này do jar hoạt động với mùa xuân, nhưng dường như java.sql không thích (trong trường hợp của tôi là trình điều khiển sap db cho Hana).
JE Carter II

Nó thực sự được gọi là System.getproperty ("java. Class.path")
RIJIK

33

Tôi đã thấy rằng đôi khi tôi gặp lỗi NoClassDefFound khi mã được biên dịch với phiên bản không tương thích của lớp được tìm thấy trong thời gian chạy. Ví dụ cụ thể tôi nhớ là với thư viện trục apache. Thực tế, có 2 phiên bản trên classpath thời gian chạy của tôi và nó đã chọn phiên bản lỗi thời và không tương thích và không phải là phiên bản chính xác, gây ra lỗi NoClassDefFound. Đây là trong một ứng dụng dòng lệnh nơi tôi đang sử dụng một lệnh tương tự như thế này.

set classpath=%classpath%;axis.jar

Tôi đã có thể lấy nó để chọn phiên bản phù hợp bằng cách sử dụng:

set classpath=axis.jar;%classpath%;

4
Có cùng một vấn đề. Hóa ra tôi đã biên dịch tệp chiến tranh với Java7, nhưng cài đặt Tomcat của tôi đang sử dụng Java6. Tôi đã phải cập nhật các biến môi trường của mình
duvo

4
Nếu điều này xảy ra như vậy thì tôi sẽ nói Java đang ở trong tình trạng lộn xộn. +2 nếu điều này đúng. Không thể xác minh điều này chưa. Nếu tìm thấy đúng sẽ làm lại + 1 (Trong phần bình luận)
siêu tân tinh

7

Đây là giải pháp tốt nhất tôi tìm thấy cho đến nay.

Giả sử chúng ta có một gói được gọi là org.mypackagechứa các lớp:

  • HelloWorld (lớp chính)
  • Bộ phận hỗ trợ
  • Đồ dùng

và các tệp xác định gói này được lưu trữ vật lý trong thư mục D:\myprogram(trên Windows) hoặc /home/user/myprogram(trên Linux).

Cấu trúc tập tin sẽ trông như thế này: nhập mô tả hình ảnh ở đây

Khi chúng tôi gọi Java, chúng tôi chỉ định tên của ứng dụng sẽ chạy : org.mypackage.HelloWorld. Tuy nhiên, chúng ta cũng phải cho Java biết nơi tìm các tệp và thư mục xác định gói của chúng ta. Vì vậy, để khởi chạy chương trình, chúng ta phải sử dụng lệnh sau: nhập mô tả hình ảnh ở đây


6

Tôi đã sử dụng Spring Framework với Maven và đã khắc phục lỗi này trong dự án của mình.

Có một lỗi thời gian chạy trong lớp. Tôi đã đọc một thuộc tính là số nguyên, nhưng khi nó đọc giá trị từ tệp thuộc tính, giá trị của nó là gấp đôi.

Spring đã không cho tôi một dấu vết ngăn xếp đầy đủ về dòng thời gian chạy thất bại. Nó chỉ đơn giản nói NoClassDefFoundError. Nhưng khi tôi thực thi nó như là một ứng dụng Java nguyên gốc (lấy nó ra khỏi MVC), thì ExceptionInInitializerErrorđó là nguyên nhân thực sự và đó là cách tôi truy tìm lỗi.

Câu trả lời của @ xli đã cho tôi cái nhìn sâu sắc về những gì có thể sai trong mã của tôi.


1
Điều tương tự cũng xảy ra với tôi khi lập trình một Servlet ( NoClassDefFoundErrorthực ra là do ExceptionInInitalizerError, nguyên nhân là do DateTimeParseException). Đó là một chút sai lệch, phải không? Tôi biết có lẽ họ có lý do để biến nó thành như vậy, nhưng thật tuyệt khi có ít nhất một gợi ý nhỏ, đó NoClassDefFoundErrorlà kết quả của một ngoại lệ khác, mà không cần phải suy luận ra. Chỉ cần ném ExceptionInInitializerErrormột lần nữa sẽ rõ ràng hơn nhiều. Đôi khi kết nối giữa hai người có thể không rõ ràng.
Bartłomiej Zieliński

5

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ả 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;
            }
        });
    }
}

1
Liên kết đã chết. Hãy thử các phiên bản lưu trữ: web.archive.org/web/20131216000019/https://blogs.oracle.com/...
avgvstvs

5

Một trường hợp thú vị mà bạn có thể thấy rất nhiều NoClassDefFoundErrorslà khi bạn:

  1. throwmột RuntimeExceptiontrong statickhối của lớp học của bạnExample
  2. Chặn nó (hoặc nếu nó không quan trọng như nó bị ném trong trường hợp thử nghiệm )
  3. Cố gắng tạo một thể hiện của lớp này Example

static class Example {
    static {
        thisThrowsRuntimeException();
    }
}

static class OuterClazz {

    OuterClazz() {
        try {
            new Example();
        } catch (Throwable ignored) { //simulating catching RuntimeException from static block
            // DO NOT DO THIS IN PRODUCTION CODE, THIS IS JUST AN EXAMPLE in StackOverflow
        }

        new Example(); //this throws NoClassDefFoundError
    }
}

NoClassDefErrorsẽ được ném kèm theo ExceptionInInitializerErrortừ khối tĩnh RuntimeException.


Đây là trường hợp đặc biệt quan trọng khi bạn nhìn thấy NoClassDefFoundErrorstrong KIỂM TRA ĐƠN VỊ .

Theo cách bạn đang "chia sẻ" việc staticthực thi khối giữa các lần kiểm tra, nhưng lần đầu tiên ExceptionInInitializerErrorsẽ chỉ trong một trường hợp kiểm tra. Cái đầu tiên sử dụng Examplelớp có vấn đề . Các trường hợp kiểm tra khác sử dụng Examplelớp sẽ chỉ ném NoClassDefFoundErrors.


4
Đây là một lời khuyên khá hữu ích trong cuộc sống thực. Tôi chỉ gặp tình huống tương tự với các trình khởi tạo thuộc tính lớp. Bạn chỉ có một lần cơ hội để xem vấn đề thực tế trong nhật ký. Khi lớp được tải (hoặc cố gắng bằng mọi cách), bạn cần khởi động lại mọi thứ.
DailyFrankPeter

4

Kỹ thuật dưới đây đã giúp tôi nhiều lần:

System.out.println(TheNoDefFoundClass.class.getProtectionDomain().getCodeSource().getLocation());

trong đó TheNoDefFoundClass là lớp có thể bị "mất" do ưu tiên cho phiên bản cũ hơn của cùng một thư viện được sử dụng bởi chương trình của bạn. Điều này thường xảy ra với các trường hợp, khi phần mềm máy khách đang được triển khai vào một thùng chứa chiếm ưu thế, được trang bị bộ nạp lớp riêng và hàng tấn phiên bản cổ của hầu hết các lib phổ biến.


3

Trong trường hợp bạn đã tạo mã (EMF, v.v.), có thể có quá nhiều trình khởi tạo tĩnh tiêu tốn tất cả không gian ngăn xếp.

Xem câu hỏi về Stack Overflow Làm thế nào để tăng kích thước ngăn xếp Java? .


"EMF" ? Ý bạn là " MEF " ?
Peter Mortensen

2
Không. EMf là Khung mô hình hóa Eclipse. Trong ô tô, chúng tôi có thể phải đối mặt với lỗi này khi chạy mã được tạo.
Aykut Kllic

1

Tôi đã khắc phục sự cố của mình bằng cách vô hiệu hóa các Thư viện preDexL cho tất cả các mô-đun:

dexOptions {
        preDexLibraries false
        ...

1

NoClassDefFoundErrorcũng có thể xảy ra khi trình khởi tạo tĩnh cố gắng tải gói tài nguyên không có sẵn trong thời gian chạy, ví dụ: tệp thuộc tính mà lớp bị ảnh hưởng cố tải từ META-INFthư mục, nhưng không có ở đó. Nếu bạn không bắt NoClassDefFoundError, đôi khi bạn sẽ không thể thấy dấu vết ngăn xếp đầy đủ; Để khắc phục điều này, bạn có thể tạm thời sử dụng một catchmệnh đề cho Throwable:

try {
    // Statement(s) that cause the affected class to be loaded
} catch (Throwable t) {
    Logger.getLogger("<logger-name>").info("Loading my class went wrong", t);
}

Điều này là không chính xác. Một tài nguyên bị thiếu sẽ không cung cấp cho bạn lỗi này. Bạn sẽ chỉ nhận được nó nếu một lớp bị thiếu.
Stephen C

@StephenC Có lẽ tôi nên nhấn mạnh phần đó nhiều hơn, nhưng tôi đã viết for example a properties file that the affected class tries to load from the META-INF directory. Điều này thực sự đã xảy ra với tôi và tôi đã có thể giải quyết NoClassDefFoundErrorbằng cách thêm tệp thuộc tính bị thiếu. Tôi đã thêm câu trả lời này chính xác bởi vì người ta sẽ không mong đợi lỗi này trong các trường hợp được đề cập.
ᴠɪɴᴄᴇɴᴛ

1
Bạn đã bỏ lỡ điều gì đó rất quan trọng trong lời giải thích của mình, bởi vì cách duy nhất mà tệp tài nguyên bị thiếu có thể kích hoạt ngoại lệ đó là nếu bạn đang cố tải tệp tài nguyên trong một statickhởi tạo ... điều này đã kích hoạt một ngoại lệ không được kiểm tra và gây ra lớp init thất bại. Bất kỳ ngoại lệ không được kiểm soát lan truyền từ khởi tạo tĩnh sẽ làm điều đó.
Stephen C

Nếu tôi sai (nghĩa là điều này không phải do statickhởi tạo thất bại ), tôi sẽ thấy thú vị khi xem một ví dụ thực tế (tức là MCVE) thể hiện hành vi.
Stephen C

1
@StephenC Bạn hoàn toàn đúng, mặc dù :( Tôi đã tìm kiếm trường hợp tôi gặp phải vấn đề này và nó thực sự liên quan đến một trình khởi tạo tĩnh cố gắng tải một gói tài nguyên. Tôi sẽ tăng / sửa mô tả nguyên nhân của tôi. Cảm ơn đã chỉ ra điều này ra ngoài.
ᴠɪɴᴄᴇɴᴛ

1

Tôi đã gặp lỗi này khi thêm phụ thuộc Maven của một mô-đun khác vào dự án của mình, vấn đề cuối cùng đã được giải quyết bằng cách thêm -Xss2mvào tùy chọn JVM của chương trình của tôi (Theo mặc định là một megabyte kể từ JDK5.0). Người ta tin rằng chương trình không có đủ ngăn xếp để tải lớp.


0

Nếu ai đó đến đây vì java.lang.NoClassDefFoundError: org/apache/log4j/Loggerlỗi, trong trường hợp của tôi, nó được tạo ra vì tôi đã sử dụng log4j 2 (nhưng tôi đã không thêm tất cả các tệp đi kèm với nó) và một số thư viện phụ thuộc đã sử dụng log4j 1. Giải pháp là thêm Log4j Cầu 1.x: jar log4j-1.2-api-<version>.jarđi kèm với log4j 2. Thông tin thêm trong quá trình di chuyển log4j 2 .


0

Hai bản sao thanh toán khác nhau của cùng một dự án

Trong trường hợp của tôi, vấn đề là Eclipse không có khả năng phân biệt giữa hai bản sao khác nhau của cùng một dự án. Tôi có một khóa trên thân cây (điều khiển phiên bản SVN) và một cái khác hoạt động trong một nhánh tại một thời điểm. Tôi đã thử một thay đổi trong bản sao làm việc như một trường hợp thử nghiệm JUnit, bao gồm trích xuất một lớp bên trong riêng thành một lớp công khai và trong khi nó đang hoạt động, tôi mở bản sao khác của dự án để xem xét một số khác một phần của mã cần thay đổi. Tại một số điểm, các cửa sổ NoClassDefFoundErrorbật lên phàn nàn rằng lớp bên trong tư nhân không có ở đó; bấm đúp vào theo dõi ngăn xếp đưa tôi đến tệp nguồn trong bản sao dự án sai.

Đóng bản sao thân của dự án và chạy trường hợp thử nghiệm một lần nữa đã thoát khỏi vấn đề.


0

Lỗi này có thể do các yêu cầu phiên bản Java không được kiểm tra .

Trong trường hợp của tôi, tôi đã có thể khắc phục lỗi này, trong khi xây dựng một dự án nguồn mở cấu hình cao, bằng cách chuyển từ Java 9 sang Java 8 bằng SDKMAN! .

sdk list java
sdk install java 8u152-zulu
sdk use java 8u152-zulu

Sau đó thực hiện cài đặt sạch như mô tả dưới đây.


Khi sử dụng Maven làm công cụ xây dựng của bạn, đôi khi rất hữu ích - và thường là hài lòng, để thực hiện bản dựng 'cài đặt' sạch với thử nghiệm bị vô hiệu hóa .

mvn clean install -DskipTests

Bây giờ mọi thứ đã được xây dựng và cài đặt, bạn có thể tiếp tục và chạy thử nghiệm.

mvn test

0

Tôi đã gặp lỗi NoClassDefFound khi tôi không xuất một lớp trên tab "Đặt hàng và Xuất" trong Đường dẫn xây dựng Java của dự án. Đảm bảo đặt dấu kiểm vào tab "Đặt hàng và xuất" của bất kỳ phụ thuộc nào bạn thêm vào đường dẫn xây dựng của dự án. Xem cảnh báo Eclipse: XXXXXXXXXXX.jar sẽ không được xuất hoặc xuất bản. Thời gian chạy ClassNotFoundExceptions có thể dẫn đến .


0

Cũng có thể là do bạn sao chép tệp mã từ IDE với tên gói nhất định và bạn muốn thử chạy nó bằng terminal. Bạn sẽ phải xóa tên gói khỏi mã trước tiên. Điều này xảy ra với tôi.


0

Trong trường hợp của tôi, tôi đã gặp lỗi này do sự không phù hợp trong các phiên bản JDK. Khi tôi cố chạy ứng dụng từ Intelij, nó không hoạt động nhưng sau đó chạy nó từ dòng lệnh hoạt động. Điều này là do Intelij đã cố chạy nó với JDK Java 11 đã được thiết lập nhưng trên dòng lệnh mà nó đang chạy với JDK Java 8. Sau khi chuyển đổi cài đặt đó trong Tệp> Cấu trúc dự án> Cài đặt dự án> SDK dự án, nó hoạt động với tôi.


0

Mọi người đều nói ở đây về một số công cụ cấu hình Java, các vấn đề về JVM, v.v. Ứng dụng khởi động mùa xuân).


0

Tôi đã gặp một vấn đề thú vị khi NoClassDefFoundError trong JavaEE làm việc với máy chủ Liberty. Tôi đã sử dụng các bộ điều hợp tài nguyên IMS và server.xml của tôi đã có bộ điều hợp tài nguyên cho imsudbJXA.rar. Khi tôi thêm bộ điều hợp mới cho imsudbXA.rar, tôi sẽ bắt đầu gặp lỗi này cho các đối tượng ví dụ cho DLIException, IMSConnectionSpec hoặc SQLInteractionSpec. Tôi không thể hiểu tại sao nhưng tôi đã giải quyết nó bằng cách tạo serverDB mới cho công việc của mình chỉ bằng imsudbXA.rar. Tôi chắc chắn rằng việc sử dụng nhiều bộ điều hợp tài nguyên trong server.xml là ổn, tôi chỉ không có thời gian để xem xét điều đó.


-1

Java không thể tìm thấy lớp A trong thời gian chạy. Lớp A nằm trong dự án maven ArtClient từ một không gian làm việc khác. Vì vậy, tôi đã nhập ArtClient vào dự án Eclipse của mình. Hai dự án của tôi đã sử dụng ArtClient làm phụ thuộc. Tôi đã thay đổi tham chiếu thư viện thành tham chiếu dự án cho những cái này (Đường dẫn xây dựng -> Cấu hình đường dẫn xây dựng).

Và vấn đề đã biến mất.


-1

Tôi đã có cùng một vấn đề, và tôi đã chứng khoán trong nhiều giờ.

Tôi tìm thấy giải pháp. Trong trường hợp của tôi, có phương thức tĩnh được xác định do đó. JVM không thể tạo đối tượng khác của lớp đó.

Ví dụ,

private static HttpHost proxy = new HttpHost(proxyHost, Integer.valueOf(proxyPort), "http");

-6

Tôi đã nhận được thông báo này sau khi xóa hai tệp khỏi thư viện SRC và khi tôi mang chúng trở lại, tôi vẫn thấy thông báo lỗi này.

Giải pháp của tôi là: Khởi động lại Eclipse. Kể từ đó tôi không thấy tin nhắn này nữa :-)


4
Điều đó được giải thích bởi câu trả lời được bình chọn nhiều nhất, khi bạn biên dịch lần đầu, các tệp đã ở đó, sau đó bạn đã xóa một số tệp, các lớp đã bị xóa, vì vậy, trong thời gian chạy, bạn đã nhận được ClassNotFound, sau đó bạn quay lại chúng, nhưng Eclipse vẫn không Lưu ý rằng các lớp được tạo vẫn bị thiếu, nhưng sau khi bạn khởi động lại Eclipse, không gian làm việc đã được làm mới và các lớp lại có sẵn, nhưng nói chung đây không phải là một giải pháp hay cách giải quyết, giải pháp là tìm ra lớp / jar nào bị thiếu trong thời gian chạy lớp học
Jose Manuel Gomez Alvarez

-7

Hãy chắc chắn rằng điều này phù hợp trong module:appmodule:lib:

android {
    compileSdkVersion 23
    buildToolsVersion '22.0.1'
    packagingOptions {
    }

    defaultConfig {
        minSdkVersion 17
        targetSdkVersion 23
        versionCode 11
        versionName "2.1"
    }

3
Làm thế nào giải pháp của bạn là trong bất kỳ cách nào có liên quan đến vấn đề phổ biến này?
Taavi Ilves

Cấu hình mẫu không cân bằng (ba {svà hai }). Bạn có thể sửa nó không?
Peter Mortensen
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.